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