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

问题描述 投票:0回答:2

首先,我做了一个简单的课:

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()方法的主要函数中,它从用户输入值,然后将其保存在二进制文件中。现在,当我尝试读取文件时,它确实将值存储在类的新对象中,但出现异常(引发异常:读取访问冲突。_Pnext为0xB414D4。)我的主要功能是这样的:

int main()
{
    ifstream os("new.dat", ios::binary);
    test b;
    os.read(reinterpret_cast<char*>(&b), sizeof(b));
    b.show();
    return 0;
}
c++ fstream unhandled-exception
2个回答
0
投票

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

在您的情况下,std :: string成员根本不是一个简单的对象!在底层,std ::字符串通常至少具有1个指向其分配该字符串的位置的指针成员。

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

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


0
投票

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

在您的情况下,std :: string成员根本不是一个简单的对象!在底层,std ::字符串通常至少具有1个指向其分配该字符串的位置的指针成员。

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

© www.soinside.com 2019 - 2024. All rights reserved.