首页 文章

将原始对象写入/读取到文件

提问于
浏览
1

问题:我需要从文件中写入/读取对象 . 这是因为我需要将std :: list写入/读取到文件中,但无论如何 . 不仅仅是T = int(这很简单),但无论如何参数 . 在使用OutputFileStream和InputFileStream的Java中,这很可能,但我认为它只是一个JVM功能 . 但是我试图读取/写入文件的对象:

template <class T>
bool write_object(std::fstream& out, const T& object)
{
    bool result=false;
    char* ptr;
    const unsigned long size=sizeof(object);
    if(out.good())
    {
        result=true;
        ptr=(char*)&object;
        for(unsigned int i=0;i<size;i++)
        {
            out << *ptr;
            ptr++;
        }
    }
    return result;
}

template <class T>
bool read_object(std::fstream& in, T& object)
{
    bool result=false;
    T* ptr;
    T swap_temp;
    const unsigned long size=sizeof(object);
    char temp[size];
    std::streampos pos;
    if(in.good())
    {
        pos=in.tellg();
        if(pos!=-1)
        {
            result=true;
            for(unsigned long i=0; i<size; i++)
            {
                if(!in.good())
                {
                    result=false;
                    break;
                }
                else
                {
                    in >> temp[i];
                }
            }
        }
    }
    if(result==false)
    {
        in.seekg(pos);
    }
    else
    {
        ptr=(T*)temp;
        swap_temp=*ptr;
        object=swap_temp;
    }
    return result;
}

但是我遇到了以下问题:-sizeof运算符只返回所有字段的大小,它也不考虑内部字段指向的数据; - 如果在类中有一个指针,那么这个指针可能指向一个“错误的”内存地址,(例如)如果我使用一个指向内存中C风格字符串的指针,一旦程序结束,该字符串被解除分配当程序实例再次运行时,这个内存区域可能在任何地方 .

这个方法是错误的,因为例如sizeof(string)与我的编译器返回4.所以我想它使用一个char指针(我在一台32位机器上)指向分配的C风格的字符串 . 可能它甚至没有记录长度 . 因此,如果字符串有32个字符,我没有注意到它,它只是复制指针的值 .

1 回答

  • 3

    你的方法无法工作,因为C不知道像反射这样的类似java的技术,所以你无法区分指针和其他成员 .

    你想要的是serialisazion,你可以将它用于像Boost.SerializationDemo)这样的库 .

    但即使这样,你也不能编写一般函数,你必须专门为每个对象定义它 .

相关问题