我注意到,使用时:
std::vector<int> v(100000);
...
std::ofstream outfile("outfile.dat", std::ios::out | std::ofstream::binary);
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(outfile));
outfile.close();
我的std::vector<int>
未被序列化为原始字节数据(每int
4个字节)但是作为字符串,即每个整数的字符串表示保存到磁盘,我不想要
如何将std::vector<int>
保存为二进制数据?
(注意:在学习新方法之前,我想用标准C ++ 03学习它。)
答案 0 :(得分:3)
要编写二进制数据,请使用std::ostream::write()
代替std::ostream_iterator
(内部使用operator<<
,因此格式化输出),例如:
std::vector<int> v(100000);
...
std::ofstream outfile("outfile.dat", std::ofstream::binary);
outfile.write(reinterpret_cast<const char*>(v.data() /* or &v[0] pre-C++11 */), sizeof(int) * v.size());
outfile.close();
答案 1 :(得分:2)
std::ostream_iterator
使用operator<<
将值写入流。元素的编写就像为向量的每个成员使用outfile << value
一样,这意味着将值转换为文本。
所以,你要做的是定义一个类,它以二进制表示形式将自身序列化为流,例如:
std::copy(v.begin(), v.end(), std::ostream_iterator<BinaryInt>(outfile));
^^^^^^^^^
现在您必须定义BinaryInt
类型,以便它可以由int
值构建,但可以通过operator<<
自行序列化:
struct BinaryInt
{
int value;
BinaryValue(int v): value(v) {}
friend std::ostream& operator<<(std::ostream& str, BinaryInt const& bi)
{
// convert bi.value into a binary representation.
// Note C++ does not define a specific size for int.
// Nor does it define an endianess.
// Nor does it define a specific representation.
// So to be cross platform/OS/compiler you will need to define these
// and convert the integer into this representation.
//
// return str.write(<data>, <size>);
//
// If this is just a test the following would work
// but is extremely brittle for the long term.
return str.write(reinterpret_cast<const char*>(&bi.value), sizeof(bi.value));
}
};
答案 2 :(得分:0)
我可以使用Protobufs推荐一种更实用的方法吗?我不会输入代码,但如果您正在处理项目,请不要重新发明轮子。
使用protobuf可以保存&#34;类型&#34;您的数据以及数据,它将帮助您以最小的麻烦扩展您的代码。