我有我的结构:
struct a
{
int x;
float f;
double d;
char c;
char s[50];
};
我希望每次都将我的计时器时间表附加到二进制文件中。
// declaration
std::ofstream outFile;
// constructor:
outFile.open( "save.dat", ios::app );
// tick:
outFile << a << endl;
但在save.dat中只显示:
0C3A0000..0C3A0000..0C3A0000..0C3A0000..0C3A0000..0C3A0000..0C3A0000..0C3A0000..0C3A0000..
提前致谢
答案 0 :(得分:6)
您目前正在做的是编写结构定义的地址 你想要做的是使用ostream::write
outfile.write(reinterpret_cast<char*>(&myStruct), sizeof(a));
只要你的结构是POD(普通旧数据)类型(你的例子就是这样)就行了。 POD类型表示所有成员都具有固定大小。
如果你另一方面有可变大小的成员,那么你需要逐个写出每个成员。
答案 1 :(得分:2)
序列化自定义对象的一种明智方法是重载您自己的输出流操作符:
std::ostream & operator<<(std::ostream & o, const a & x)
{
o.write(reinterpret_cast<char*>(&x.x), sizeof(int));
o.write(reinterpret_cast<char*>(&x.f), sizeof(float));
/* ... */
return o;
}
a x;
std::ofstream ofile("myfile.bin", std::ios::binary | std::ios::app);
ofile << a;
这仍然依赖于平台,因此为了更安全一点,您应该使用固定宽度的数据类型,如int32_t
等。
对于二进制输出,使用<<
在语义上也可能不是最佳选择,因为它通常用于格式化输出。也许稍微更安全的方法是编写函数void serialize(const a &, std::ostream &);