如何从文件中读取类的指针

How to read pointer of class from file

本文关键字:指针 读取 文件      更新时间:2023-10-16

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

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

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

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

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

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

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