C++ 在文件中存储对象

标签 c++ object binary storage fstream

我有一个对象列表,我想将这些对象存储在一个尽可能小的文件中以供以后检索。我一直在仔细阅读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/

相关文章:

c++ - VTK/ITK 项目请求的模块在 ubuntu 上不可用

gwt - 二进制数据和GWT

c++ - 检查原始文件 C++ 的输出

c++ - C++中的十进制到8位二进制转换

c++ - 如何跟踪整数变化 vector 的中位数?

c++ - 用 C++ 解析二进制协议(protocol)的好库

c++ - Qt Creator `Separate debug info` 是什么意思?

mysql - rails - .find 从数据库返回数据但缺少列

javascript - 如何根据另一个对象数组过滤一个对象数组?

javascript - 如何在 Javascript 中使用对此的新引用调用父定义的 block