gpt4 book ai didi

C++ 在文件中存储对象

转载 作者:太空狗 更新时间:2023-10-29 19:45:05 24 4
gpt4 key购买 nike

我有一个对象列表,我想将这些对象存储在一个尽可能小的文件中以供以后检索。我一直在仔细阅读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 扩展名吗? 那我应该用什么代替呢?我试过 .dtb 但无法创建文件。 /edit> 实际上,我什至无法使用 ios::binary 标志正确打开文件。我在传递文件名时也遇到了问题(作为字符串类字符串,由 c_str() 转换回来,它编译但给出错误)。

很抱歉问了这么多小问题,但基本上可以归结为如何有效地将对象存储在文件中?

最佳答案

您正在尝试做的事情称为序列化。 Boost 有一个 very good library为此。

在某些情况下,您尝试做的事情可以在一些非常重要的条件下起作用。它只适用于 POD类型。它只保证适用于使用相同版本的编译器和相同参数编译的代码。

(char*)&(*i)

表示获取迭代器 i,取消引用它以获取您的对象,获取它的地址并将其视为字符数组。这是写入文件的开始。 sizeof(Referral) 是将要写出的字节数。

不,迭代器不一定是指针,尽管指针满足迭代器的所有要求。

关于C++ 在文件中存储对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1488672/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com