从二进制文件读取元素时抛出异常(抛出异常:读取访问冲突。_Pnext 为 0xB414D4。)

Exception thrown while reading elements from a binary file (Exception thrown: read access violation. _Pnext was 0xB414D4.)

首先我做了一个简单的class:

class test
{
public:
    test(string name="",int age=0);
    void getData();
    void show();
private:
    string name;
    int age;
};

test::test(string name,int age)
{
    this->age = age;
    this->name = name;
}
void test::getData()
{
    cin >> age;
    cin >> name;
}
void test::show()
{
    cout << "AGE:" << age<<"\n";
    cout << "NAME:" << name << "\n";
}

在我的主函数中调用 getData() 方法从用户输入值,然后将它们保存在二进制文件中。 现在,当我尝试读取文件时,它确实将值存储在 class 的新对象中,但出现异常(抛出异常:读取访问冲突。_Pnext 为 0xB414D4。) 我的主要功能如下所示:

int main()
{
    ifstream os("new.dat", ios::binary);
    test b;
    os.read(reinterpret_cast<char*>(&b), sizeof(b));
    b.show();
    return 0;
}

这里的问题是您试图读取 test 对象,就好像它是一个简单的平面对象一样。由于很多很多原因,这几乎总是一个坏主意。

在你的例子中,std::string 成员根本不是一个简单的对象!在幕后,std::string 通常至少有 1 个指针成员指向它分配字符串的位置。

如果您只是在一个会话中保存 test 对象,并在另一个会话中恢复二进制表示,那么您将这些指针设置为现在完全是垃圾的地址。

这里的问题是您试图读取 test 对象,就好像它是一个简单的平面对象一样。由于很多很多原因,这几乎总是一个坏主意。

在你的例子中,std::string 成员根本不是一个简单的对象!在幕后,std::string 通常至少有 1 个指针成员指向它分配字符串的位置。

如果您只是在一个会话中保存 stest 对象,并在另一个会话中恢复二进制表示,那么您将这些指针设置为现在完全是垃圾的地址。

以以后可恢复的方式保存数据结构的过程称为序列化,这是一个复杂的主题。