我尝试在C++中的二进制文件中读写类的对象。我不想单独写入数据成员,而是一次写入整个对象。举个简单的例子:
class MyClass {
public:
int i;
MyClass(int n) : i(n) {}
MyClass() {}
void read(ifstream *in) { in->read((char *) this, sizeof(MyClass)); }
void write(ofstream *out){ out->write((char *) this, sizeof(MyClass));}
};
int main(int argc, char * argv[]) {
ofstream out("/tmp/output");
ifstream in("/tmp/output");
MyClass mm(3);
cout<< mm.i << endl;
mm.write(&out);
MyClass mm2(2);
cout<< mm2.i << endl;
mm2.read(&in);
cout<< mm2.i << endl;
return 0;
}
但是,正在运行的输出表明,未正确读取应该被写入二进制文件的mm.i值并将其正确分配给mm2.i
$ ./main
3
2
2
那怎么了?
通常,在将二进制文件写入类文件或从二进制文件读取类的对象时,我应该注意些什么?
最佳答案
数据正在缓冲中,因此当您去读取它时,它实际上并没有到达文件。由于您使用两个不同的对象来引用输入/输出文件,因此操作系统不知道它们之间的关系。
您需要刷新文件:
mm.write(&out);
out.flush()
或关闭文件(执行隐式刷新):
mm.write(&out);
out.close()
您还可以通过使对象超出范围来关闭文件:
int main()
{
myc mm(3);
{
ofstream out("/tmp/output");
mm.write(&out);
}
...
}
关于c++ - 在二进制文件中读写类的对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2046829/