加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C将对象存储在文件中

发布时间:2020-12-16 10:26:38 所属栏目:百科 来源:网络整理
导读:我有一个对象列表,我希望将其存储在尽可能小的文件中,以便以后检索.我一直在仔细阅读 this tutorial,并开始(我认为)理解,但有几个问题.这是我正在使用的代码片段: static bool writeHistory(string fileName){ fstream historyFile; historyFile.open(fileN
我有一个对象列表,我希望将其存储在尽可能小的文件中,以便以后检索.我一直在仔细阅读 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));

不编译?我是一个迭代器(并不是一个迭代器指针?).或者干脆

historyFile.write(i,sizeof(Referral));

为什么我还需要搞乱地址呢?我不是将数据存储在文件中吗?如果地址/值持续存在,为什么我不能只存储以纯文本形式分隔的地址而不是稍后获取它们的值?

我还应该使用.txt扩展吗? <编辑>那我应该用什么呢?我试过.dtb并且无法创建文件. < /编辑>我实际上甚至无法使用ios :: binary标志在没有错误的情况下打开文件.我也无法传递文件名(作为字符串类字符串,由c_str()转换回来,它编译但出错).

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

解决方法

您要做的是称为序列化.为此,Boost有一个 very good library.

在某些情况下,您尝试做的事情可能会有一些非常重要的条件.它仅适用于POD类型.它只能保证适用于使用相同版本的编译器编译的代码,并且具有相同的参数.

(字符*)及(* I)

说要取迭代器i,取消引用它来获取你的对象,取出它的地址并将其视为一个字符数组.这是写入文件的开始. sizeof(Referral)是要写出的字节数.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读