c ++将结构附加到二进制文件中

时间:2011-07-26 12:08:54

标签: c++ file struct append

我有我的结构:

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..

提前致谢

2 个答案:

答案 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 &);