c++ 从二进制文件里 无法读出数据 并显示到屏幕上,求大神解答

#include<iostream>
#include<fstream>
using namespace std;
class ok
{
protected:
string name;
int i;
public:
ok(string k="00",int w=0):name(k),i(w){}
void out(){cout <<name<<i;}
};
int main()
{
/* ok o("www",1);
ofstream outfile("1.dat",ios::binary);
outfile.write((char *)&o,sizeof(o));
outfile.close();
*/
ok s;
ifstream infile("1.dat",ios::binary);
infile.read((char *)&s,sizeof(s));
infile.close();
s.out();
return 0;
}

注释部分是第一次用来将数据写进文件的,第一次运行写进文件 然后第二次运行前将其注释掉
运行发现程序停止运行了,但我并不知道为什么,求大神详解

试一下把生成文件和读取文件的两段代码都开启并运行, 你会发现这个程序不会报错。为什么呢?

string 类并非单纯的char数组,里面有其他C++标准库用来实现string类各种方便功能所需的变量。string类会自己动态分配一块内存用来存储你的信息。这段内存的位置在每次运行程序的时候不同。 你在序列化你的string的时候,他会把string内部记录内存地址变量也序列化。两次运行,如果分配到的动态内存地址不同, 你的ok类在调用destructor的时候就会试图destruct string name, 然而name里面的地址是错误的,所以就会在释放内存的时候出错。追问

是说从文件里读出来的 string类型的成员变量里内部的记录地址的变量 所被赋的值是指向第一次o这个对象里面的string变量?

追答

你说得对。

追问

那有什么方法能让那个string内部记录地址的变量 指向本string变量?(或是说怎么改能改正确?)

追答

你应该为你所使用的自定义的类都制定Serialize和Deserialize 函数,用于把内存内容写成二进制。比如如果你有一个string类,就把里面的文本内容写入二进制,而不是把string类的成员变量写进去。根据每个自定义类的成员变量量身定制Serialize函数。

追问

抱歉,还是没听太懂,能私聊吗?

温馨提示:答案为网友推荐,仅供参考
相似回答