我尝试在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/

10-11 23:14
查看更多