Write and read object of class into and from binary file

前端 未结 4 1275
陌清茗
陌清茗 2020-12-31 05:51

I try to write and read object of class into and from binary file in C++. I want to not write the data member individually but write the whole object at one time. For a simp

相关标签:
4条回答
  • 2020-12-31 06:23

    I'll echo "you shouldn't be doing this". If you print out sizeof(myc) in the code above it's probably 4, as you'd expect... BUT try changing read and write to be virtual. When I did so, it prints out the size as 16. Those 12 bytes are internal guts with sensitive values—and saving them out and then reading them back in would be like expecting a pointer value to be still good if you wrote it and loaded it again.

    If you want to circumvent serialization and map C++ object memory directly to disk, there are ways to hack that. But rules are involved and it's not for the faint of heart. See POST++ (Persistent Object Storage for C++) as an example.

    I'll add that you did not check the fail() or eof() status. If you had you'd have known you were misusing the fstream API. Try it again with:

    void read(ifstream *in) {
        in->read((char *) this, sizeof(myc));
        if (in->fail())
            cout << "read failed" << endl;
    }
    void write(ofstream *out){
        out->write((char *) this, sizeof(myc));
        if (out->fail())
            cout << "write failed" << endl;
    }
    

    ...and see what happens.

    0 讨论(0)
  • 2020-12-31 06:25

    Dumping raw data is a terrible idea, from multiple angles. This will break even worse once you add pointer data.

    One suggestion would be to use Boost.Serialization which allows for far more robust data dumping.

    Your main problem is the file does not contain the contents yet due to fstream buffering. Close or flush the file.

    0 讨论(0)
  • 2020-12-31 06:36

    The data is being buffered so it hasn't actually reached the file when you go to read it. Since you using two different objects to reference the in/out file, the OS has not clue how they are related.

    You need to either flush the file:

    mm.write(&out);
    out.flush()
    

    or close the file (which does an implicit flush):

    mm.write(&out); 
    out.close()
    

    You can also close the file by having the object go out of scope:

    int main()
    {
        myc mm(3);
    
        {
            ofstream out("/tmp/output");
            mm.write(&out); 
        }
    
        ...
    }
    
    0 讨论(0)
  • 2020-12-31 06:36

    My C++ is pretty rust and highly under-tested, but you may want to take a look at Serialization and Unserialization. FAQ

    0 讨论(0)
提交回复
热议问题