【问题标题】:How to read double from binary file and save it in a vector [duplicate]如何从二进制文件中读取双精度并将其保存在向量中[重复]
【发布时间】:2017-06-04 21:16:21
【问题描述】:

我在读取二进制文件时遇到问题。

到目前为止我的代码:

ifstream file("ns.bin", ios::in | ios::binary | ios::ate);
file.seekg(0, std::ios::end); 
size = file.tellg();  
file.seekg(0, std::ios::beg); 
buffer = new char[size];
file.read(buffer, size);
file.close();

double* double_values = (double*)buffer;//reinterpret as doubles

我的问题是:我如何将来自double_values 的双打变成这种类型的向量:

vector<double> buffer2;

或者,如果不可能:如何从double_values 获得双打数?

希望某人能帮助我谢谢!

【问题讨论】:

    标签: c++ visual-studio vector binary


    【解决方案1】:

    首先解决问题。在这里完全回答:How to initialize std::vector from C-style array?

    const int size = 64;
    char* chars = new char[64];
    double* double_values = (double*)chars;
    
    const int size_of_doubles = (sizeof(char)*size)/sizeof(double);
    std::cout<<"Doubles: "<<size_of_doubles<<'\n';
    std::vector<double> buffer2(double_values, double_values+size_of_doubles );
    std::cout<<buffer2.size();
    delete chars;
    

    我还要指出,将变量直接复制到二进制文件中并返回是不明智的。可能会出现类型大小、字节顺序或(如果是文本)编码等问题,并在不同的计算机上破坏您的程序。

    【讨论】:

    【解决方案2】:

    只需将其复制到向量中即可:

    vector<double> buffer2(double_values, double_values + (size / sizeof(double)));
    

    解释:

    这使用了 std::vector 的迭代器构造函数(选项 4 here),它需要一个开始迭代器和一个结束迭代器。指针是迭代器,要获取结束迭代器,您需要知道数组中有多少元素。

    事实证明,您知道数组有多少字节,因此将总大小除以一个 double 元素的大小即可得出数组的总长度。

    然后通过添加开始迭代器的大小来找到结束迭代器变得微不足道。

    【讨论】:

    • 谢谢!为你提出和很好的解释:) 我还有另一个问题,也许你有一个想法:) 我试图用 cout 打印向量,并作为限制,我设置了双打的数量 size / sizeof(double)... 并且它有效。 . 它打印每一个双倍(大小/大小(双)它也是正确的数字)但最后它也打印……但你看不到任何东西,它看起来像是在打印空间......所以我也用 2d 尝试过向量,在这里他打印了一些 0 s ...你知道为什么吗?
    • 很难说出你的问题到底是什么,但我猜你正试图在最后一个元素之后打印一个; cout &lt;&lt; buffer2[buffer2.size()] 是未定义的行为
    猜你喜欢
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    相关资源
    最近更新 更多