c++ 从二进制文件里 无法读出数据 并显示到屏幕上,求大神解答
#include<iostream>#include<fstream>usingnamespacestd;classok{protected:stringname;int...
#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;
}
注释部分是第一次用来将数据写进文件的,第一次运行写进文件 然后第二次运行前将其注释掉
运行发现程序停止运行了,但我并不知道为什么,求大神详解 展开
#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;
}
注释部分是第一次用来将数据写进文件的,第一次运行写进文件 然后第二次运行前将其注释掉
运行发现程序停止运行了,但我并不知道为什么,求大神详解 展开
1个回答
展开全部
试一下把生成文件和读取文件的两段代码都开启并运行, 你会发现这个程序不会报错。为什么呢?
string 类并非单纯的char数组,里面有其他C++标准库用来实现string类各种方便功能所需的变量。string类会自己动态分配一块内存用来存储你的信息。这段内存的位置在每次运行程序的时候不同。 你在序列化你的string的时候,他会把string内部记录内存地址变量也序列化。两次运行,如果分配到的动态内存地址不同, 你的ok类在调用destructor的时候就会试图destruct string name, 然而name里面的地址是错误的,所以就会在释放内存的时候出错。
string 类并非单纯的char数组,里面有其他C++标准库用来实现string类各种方便功能所需的变量。string类会自己动态分配一块内存用来存储你的信息。这段内存的位置在每次运行程序的时候不同。 你在序列化你的string的时候,他会把string内部记录内存地址变量也序列化。两次运行,如果分配到的动态内存地址不同, 你的ok类在调用destructor的时候就会试图destruct string name, 然而name里面的地址是错误的,所以就会在释放内存的时候出错。
更多追问追答
追问
是说从文件里读出来的 string类型的成员变量里内部的记录地址的变量 所被赋的值是指向第一次o这个对象里面的string变量?
追答
你说得对。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |