-3

我正在尝试将类的指针写入文件然后读取它。写得很好,但读显示类型转换错误。请帮忙。以 this(integer).. 为例。如果我们使用 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();
}
4

2 回答 2

2

指针只是一个内存地址。正如你所说,你可以写得很好,但是当你它时,它仍然只是一个内存地址。除非它指向的对象在您读取它时位于完全相同的内存位置,否则您将“读取”一个指向随机数据的指针,您无法将其转换为它之前指向的对象的类。

这就像存储一只蝴蝶的位置(纬度/经度),然后试图从那个位置找到那只蝴蝶。蝴蝶现在最有可能在一个完全不同的地方。

于 2013-07-27T21:53:57.837 回答
0

您正在尝试的是通常称为序列化。

这个想法是编写类实例(包含所有数据)和一个可以作为实例地址的 ID,因为这是一个非常独特的 ID。您的序列化库会注意只写入一个实例(因为只需要一个数据集),并且该实例的所有后续写入都只能通过写入指针来完成。

回读也很简单。您的序列化库知道它需要一个类的实例,如果尚未使用唯一 ID(可能是前面提到的指针/地址),则生成一个具有之前编写的内容的新实例。之后,每次尝试获取“读取指针”都会导致将指针设置为新生成实例的实际值。

查看序列化程序模式或具体实现,如 boost::serialize http://www.boost.org/doc/libs/1_58_0/libs/serialization/doc/index.html

于 2015-06-08T13:08:18.410 回答