首先,我做了一个简单的课:
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;
}
这里的问题是,您试图读取test
对象,就像它是一个简单的平面对象一样。由于许多很多原因,这几乎总是一个坏主意。
在您的情况下,std :: string成员根本不是一个简单的对象!在底层,std ::字符串通常至少具有1个指向其分配该字符串的位置的指针成员。
如果只在一个会话中保存s test
对象,然后在另一会话中恢复二进制表示,则将这些指针设置为现在完全是垃圾的地址。
以一种以后可恢复的方式保存数据结构的过程称为序列化,这是一个复杂的主题。
这里的问题是,您试图读取test
对象,就像它是一个简单的平面对象一样。由于许多很多原因,这几乎总是一个坏主意。
在您的情况下,std :: string成员根本不是一个简单的对象!在底层,std ::字符串通常至少具有1个指向其分配该字符串的位置的指针成员。
如果仅在一个会话中保存test
对象,然后在另一会话中恢复二进制表示,则将这些指针设置为现在完全是垃圾的地址。