我在阅读二进制文件时遇到问题。
到目前为止我的代码:
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
获得双打数量?
希望某人能帮助我,谢谢!
答案 0 :(得分:1)
只需将其复制到矢量中:
vector<double> buffer2(double_values, double_values + (size / sizeof(double)));
说明:
它使用std::vector
(选项4 here)的迭代器构造函数,它需要一个开始迭代器和一个结束迭代器。指针是迭代器,要获得结束迭代器,您需要知道数组中有多少个元素。
事实证明,你知道数组有多少字节,所以取总大小并除以一个双元素的大小就可以得到数组的总长度。
通过添加开始迭代器的大小来找到结束迭代器变得微不足道。
答案 1 :(得分:0)
首先是问题所在。这里完全回答: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;
我还说过将变量直接复制到二进制文件中并将其复制回来是不明智的。类型大小,字节顺序或(在文本情况下)编码等问题可能会出现并在不同的计算机上破坏您的程序。