我有一个对象列表,我想将这些对象存储在一个尽可能小的文件中以供以后检索。我一直在仔细阅读this tutorial ,并开始(我认为)理解,但有几个问题。这是我正在使用的代码片段:
static bool writeHistory(string fileName)
{
fstream historyFile;
historyFile.open(fileName.c_str(), ios::binary);
if (historyFile.good())
{
list<Referral>::iterator i;
for(i = AllReferrals.begin();
i != AllReferrals.end();
i++)
{
historyFile.write((char*)&(*i),sizeof(Referral));
}
return true;
} else return false;
}
现在,这是根据片段改编的
file.write((char*)&object,sizeof(className));
摘自教程。现在我相信它正在做的是将对象转换为指针,获取值和大小并将其写入文件。但如果它正在这样做,为什么还要费心进行转换呢?为什么不从一开始就取值呢?为什么它需要大小?此外,根据我的理解,为什么
historyFile.write((char*)i,sizeof(Referral));
不编译? i 是一个迭代器(迭代器不是指针吗?)。或者简单地
historyFile.write(i,sizeof(Referral));
为什么我还需要弄乱地址?我不是将数据存储在文件中吗?如果地址/值是独立存在的,为什么我不能只存储以纯文本分隔的地址,然后再获取它们的值?
我还应该使用 .txt 扩展名吗?
很抱歉问了这么多小问题,但基本上可以归结为如何有效地将对象存储在文件中?
最佳答案
您正在尝试做的事情称为序列化。 Boost 有一个 very good library为此。
在某些情况下,您尝试做的事情可以在一些非常重要的条件下起作用。它只适用于 POD类型。它只保证适用于使用相同版本的编译器和相同参数编译的代码。
(char*)&(*i)
表示获取迭代器 i,取消引用它以获取您的对象,获取它的地址并将其视为字符数组。这是写入文件的开始。 sizeof(Referral)
是将要写出的字节数。
不,迭代器不一定是指针,尽管指针满足迭代器的所有要求。
关于C++ 在文件中存储对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1488672/