我正在尝试将类的指针写入文件然后读取它。写作很好,但阅读显示类型转换错误。请帮忙。 举个例子(整数)..如果我们使用int而不是int *那么代码执行但不是很好。
#include<iostream>
#include<windows.h>
#include<fstream>
using namespace std;
void save(int *ptr)
{
ofstream data;
data.open("info.txt",ios::app);
if (data.is_open())
{
data<<ptr;
data.close();
}
else
{
cout << "Unable to open file";
}
}
int* loaddata()
{
ifstream data;
int ptr;
data.open("info.txt");
if (data.is_open())
{
while (!data.eof() )
{
data>>ptr;
}
data.close();
}
else
{
cout << "Unable to open file";
}
return ptr;
}
void main()
{
int a=0;
save(&a);
int *ptr=loaddata();
}
答案 0 :(得分:2)
指针只是一个内存地址。正如你所说,你可以写得很好,但当你读它时,它仍然只是一个内存地址。除非它所指向的对象在读取时位于完全相同的内存位置,否则您将“读取”指向随机数据的指针,您无法将其转换为之前指向的对象的类。
就像存储蝴蝶的位置(纬度/经度),然后试图从那个位置找到那只蝴蝶。现在,蝴蝶在一个完全不同的地方最为可能。
答案 1 :(得分:0)
您正在尝试的是通常称为序列化。
这个想法是编写类实例(包含所有数据)和一个ID,它可以是实例的地址,因为这是一个非常独特的id。您的序列化库需要注意只写入一个实例(因为只需要一个数据集),并且只能通过编写指针来完成此实例的所有后续写入。
回读也很简单。序列化库知道它需要一个类的实例,如果没有使用唯一的id(可能是前面提到的指针/地址),则生成一个新的内容,如前所述。之后,每次尝试获得一个&#34;读指针&#34;导致将指针设置为新生成的实例的实际值。
查看序列化程序模式或具体实现,如boost :: serialize http://www.boost.org/doc/libs/1_58_0/libs/serialization/doc/index.html