从二进制文件读取元素时抛出异常(抛出异常:读取访问冲突。_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
对象,并在另一个会话中恢复二进制表示,那么您将这些指针设置为现在完全是垃圾的地址。
以以后可恢复的方式保存数据结构的过程称为序列化,这是一个复杂的主题。
首先我做了一个简单的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
对象,并在另一个会话中恢复二进制表示,那么您将这些指针设置为现在完全是垃圾的地址。
以以后可恢复的方式保存数据结构的过程称为序列化,这是一个复杂的主题。