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

C++ c++;将结构附加到二进制文件中,c++,file,struct,append,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 <<

我有我的结构:

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;

提前感谢

您当前正在编写结构定义的地址。
你要做的是使用

outfile.write(reinterpret_cast(&myStruct),sizeof(a));
只要您的结构是POD(普通旧数据)类型(您的示例就是这样),这就可以工作。POD类型意味着所有成员的大小都是固定的


另一方面,如果您有可变大小的成员,则需要逐个写出每个成员。

您当前正在做的是写入结构定义的地址。
你要做的是使用

outfile.write(reinterpret_cast(&myStruct),sizeof(a));
只要您的结构是POD(普通旧数据)类型(您的示例就是这样),这就可以工作。POD类型意味着所有成员的大小都是固定的


另一方面,如果您有可变大小的成员,则需要逐个写出每个成员。

序列化自定义对象的合理方法是重载您自己的输出流操作符:

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;

std::ostream&operator序列化自定义对象的合理方法是重载您自己的输出流操作符:

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;

std::ostream&operator你给我们全部代码了吗?您可能正在打印指针值。你必须超载
你给我们全部代码了吗?您可能正在打印指针值。您必须重载
,这可能仍然不是一个好主意,因为结构将具有平台相关的填充…@ghiboz:为什么您认为在使用ios:app时会覆盖它?这可能仍然不是一个好主意,因为这个结构将有平台相关的填充…@ghiboz:为什么你认为你在使用ios:app时会覆盖它?而且可能仍然不是一个好主意,因为你有小/大端系统…当然,你必须根据自己的需要设计它。。。这要看情况而定。如果你在X86/X64服务器农场(像脸谱网),你需要高吞吐量,你可以认为这是一个有效但有限的范围解决方案;如果你想成为超级独立于平台的人,你必须精确地记录二进制格式。这完全取决于你的需要!(如果你愿意的话,你也可以讨论浮点序列化的主题……这取决于你的实际情况。)而且可能仍然不是一个好主意,因为你有小/大端系统……当然,你必须根据你的需要来设计它。。。这要看情况而定。如果你在X86/X64服务器农场(像脸谱网),你需要高吞吐量,你可以认为这是一个有效但有限的范围解决方案;如果你想成为超级独立于平台的人,你必须精确地记录二进制格式。这完全取决于你的需要!(如果您愿意,还可以讨论浮点序列化的主题……这取决于具体情况。)
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;