ysh 2021-12-06 12:26 采纳率: 0%
浏览 68

C++里如何把vector<bool>或vector<unsigned char>对象的数据保存到文件,以及从文件装载回内存

我用vector做一个bloom filter,需要把生成的过滤器持久化到文件,再从文件恢复到内存。但在这个环节遇到了问题。
我写了以下把vetor bit_table_ 内容写入文件,以及从文件重载回内存的两个函数,但装载后的内容与实际内容是不一样的,以致不能通过bloom filter的检测。
#2021-12-06晚间更新:
通过网上查资料,自己琢磨测试,找到了一种方法能勉强解决上述问题。但有一个地方的写法有点蠢:其中反序列化装载函数的实现,先从文件把内容读入一个临时vector,再swap到类成员变量的写法实在是很LOW,特别是对于巨大的,非常耗内存的大型bloom filter,这种写法要占用双倍的内存,非常不可取。但我这种C++新手,一时半会又找不到更好且可行的写法,还请各路大神继续帮助,给出更好的实现方法。

img

     详见下文回复内容。

#----------------------------------


//把过滤器内存持久化到文件
       inline bool dump_tofile(string filename)
       {
           ofstream fout(filename.c_str(), ios::binary);
           if(fout.is_open()==false)
           {
               std::cout<<"Open file:" << filename <<" fail!"<<std::endl;
               return false;
           }
           std::vector<bool>::size_type n = bit_table_.size();
           fout.write((const char*)&n, sizeof(std::vector<bool>::size_type));
           for(std::vector<bool>::size_type i = 0; i < n;)
           {
               unsigned char aggr = 0;
               for(unsigned char mask = 1; mask > 0 && i < n; ++i, mask <<= 1)
                   if(bit_table_.at(i))
                       aggr |= mask;
               fout.write((const char*)&aggr, sizeof(unsigned char));
           }
           fout.close();
           std::cout << "已把"<< n/(1024*1024) <<" MB 的过滤器内容保存到文件:"<< filename << std::endl;
           return true;
       }
       //从文件中加载过滤器
       inline bool load_fromfile(string filename)
       {
           ifstream fin(filename.c_str(), ios::binary);
           if(fin.is_open()==false)
           {
               std::cout<<"Open file:" << filename <<" fail!"<<std::endl;
               return false;
           }
           std::vector<bool>::size_type n;
           fin.read((char*)&n, sizeof(std::vector<bool>::size_type));
           bit_table_.resize(n);
           for(std::vector<bool>::size_type i = 0; i < n;)
           {
               unsigned char aggr;
               fin.read((char*)&aggr, sizeof(unsigned char));
               for(unsigned char mask = 1; mask > 0 && i < n; ++i, mask <<= 1)
                   bit_table_.at(i) = aggr & mask;
           }
           fin.close();
           std::cout << "已把"<< n/(1024*1024) <<" MB 的过滤器从文件:"<< filename << "装载到内存。" << std::endl;
       }

求大神指导

  • 写回答

5条回答 默认 最新

  • 真相重于对错 2021-12-06 12:31
    关注

    我记得网上有说不要往vector里面放bool,会遇到坑的

    评论

报告相同问题?

问题事件

  • 修改了问题 12月6日
  • 修改了问题 12月6日
  • 修改了问题 12月6日
  • 创建了问题 12月6日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度