问题:我需要从文件中写入/读取对象 . 这是因为我需要将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 回答
你的方法无法工作,因为C不知道像反射这样的类似java的技术,所以你无法区分指针和其他成员 .
你想要的是serialisazion,你可以将它用于像Boost.Serialization(Demo)这样的库 .
但即使这样,你也不能编写一般函数,你必须专门为每个对象定义它 .