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

时间:2012-03-30 21:25:37

标签: c++ serialization fstream

问题:我需要从文件中写入/读取对象。这是因为我需要写入/读取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 个答案:

答案 0 :(得分:3)

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

您想要的是 serialisazion ,您可以将其用于Boost.SerializationDemo)等库。

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