使用C++将用户定义的数据类型保存到文件中

tms*_*msh 0 c++ fwrite fread

我有一个这样的课:

struct SomeClass{

    SomeClass(){}

    SomeClass(const SomeClass& rhs):
    _m1(rhs._m1),
    _m2(rhs._m2),
    _m3(rhs._m3),
    _m4(rhs._m4){}

    SomeClass& operator=(const SomeClass& rhs){
    // same as above
    return *this;
    }

    int _m1;
    std::vector<int> _m2;
    std::vector<int> _m3;
    int _m4;
};
Run Code Online (Sandbox Code Playgroud)

在我的程序中的某个时刻,我想保存存储在SomeClass对象中的数据供以后使用:

    SomeClass someObj = arr->getBest(); // arr is a pointer to AnotherClass,
                                        // in which different SomeClass
                                        // objects are initialized and then
                                        // involved in various 
                                        // computations in AnotherClass, 
                                        // finally the best one SomeClass 
                                        // object will be save here
    fwrite(&someObj, sizeof(SomeClass), 1, saveFile);
Run Code Online (Sandbox Code Playgroud)

保存文件后saveFile,我尝试读取它并收到错误:

    SomeClass readingSomeObj;
    fread(&readingSomeObj, sizeof(SomeClass), 1, savedFile));
Run Code Online (Sandbox Code Playgroud)

编译器投诉"访问冲突读取位置0x ...".通过观看当地人在VS,我看到的另外两个领域readingSomeObj,即_m1_m4在它们的值,但不_m2_m3,在VS它说:"无法读取内存". vs错误提示

它进一步将问题与SomeClass特别是这条线相关联_m2(rhs._m2),.

但是,当我被保存someObj在该行fwrite(&someObj, sizeof(SomeClass), 1, saveFile);我也看到了两个成员_m2_m3someObj具有值(悬停在标题上我的鼠标&someObj).

我无法弄清楚出了什么问题.我的猜测是构造函数的问题SomeClass,但仍然作为C++的新手,我不知道如何纠正它.在我的程序的其他部分,我使用空构造函数SomeClass来初始化一个成员AnotherClass.但除了这个保存/阅读部分,一切都运行良好.我正在寻求你的慷慨帮助,万分感谢!

Lig*_*ica 5

您已经对数据类型做了大量假设,但这些假设并不成立.最令人震惊的是,它的所有字节都存储在内存中的"行"中,它们彼此相邻,这是逐块复制和读取可能工作的唯一方式.

这可能适用于POD(模对齐和字节序注意事项),但它不适用于复杂的数据类型,例如vector指向实际存储在其他地方的"真实"数据(通过动态分配).

你的反序列化向量几乎只包含长期无效的指针值.

您的序列化例程必须比这更智能.最终没有"一种"方式来做到这一点.您可以定义自己的格式,也可以使用一些已经具有支持标准容器格式的现成序列化解决方案.

一些想法可以谷歌"C++类序列化".