高效的方法将巨大的boost dynamic_bitset向量写入文件并将其读回

时间:2012-07-06 09:10:10

标签: c++ boost file-io boost-dynamic-bitset

我有一个boost dynamic_bitset的巨大向量。我想将dynamic_bitset向量写入文件,然后将文件读回到dynamic_bitset向量中。 dynamic_bitset的内存是否作为连续的内存块分配(这样我可以一次写入整个向量而不进行遍历)?

bitset向量的大小为数百万。所以我正在寻找一种有效的方法将它们写入文件而不是迭代元素。

我将dynamic_bitset转换为字符串,然后将字符串写入文件。稍后从文件中读取字符串并将其转换回dynamic_bitset。

下面是我使用Visual Studio在C ++中编写的代码:

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <boost/dynamic_bitset.hpp>
using namespace std;

int main(int argc, char* argv[])
{
  // Initializing a bitset vector to 0s
  boost::dynamic_bitset<> bit_vector(10); 
  bit_vector[0] = 1;   bit_vector[1] = 1;  bit_vector[4] = 1;  bit_vector[7] = 1;  bit_vector[9] = 1;
  cout<<"Input :"<<bit_vector<<endl; //Prints in reverse order

  //Converting dynamic_bitset to a string
  string buffer;
  to_string(bit_vector, buffer);

  //Writing the string to a file
  ofstream out("file", ios::out | ios::binary);  
  char *c_buffer = (char*)buffer.c_str();   
  out.write(c_buffer, strlen(c_buffer));
  out.close();

  //Find length of the string and reading from the file
  int len = strlen(c_buffer);
  char* c_bit_vector = new char(len+1);
  ifstream in;
  in.open("file", ios::binary);
  in.read(c_bit_vector, len);
  c_bit_vector[len] = 0;
  in.close();

  //Converting string back to dynamic_bitset
  string str2 = c_bit_vector;
  boost::dynamic_bitset<> output_bit_vector( str2 );
  cout<<"Output:"<<output_bit_vector<<endl;

  system("PAUSE");
  return 0;
}

但即使这种方法,将其存储为字符串,也需要很长时间才能写入文件。当我尝试从文件读回字符串时,我得到一个“未处理的访问冲突异常”。有没有更有效的方法来实现相同的?

1 个答案:

答案 0 :(得分:1)

hm ... mb use operator&lt;&lt;和运算符&gt;&gt;?

template <typename Ch, typename Tr, typename Block, typename Alloc>
std::basic_ostream<Ch, Tr>&
operator<<(std::basic_ostream<Ch, Tr>& os,
           const dynamic_bitset<Block, Alloc>& b)

template <typename Ch, typename Tr, typename Block, typename Alloc>
std::basic_istream<Ch, Tr>&
operator>>(std::basic_istream<Ch, Tr>& is, dynamic_bitset<Block, Alloc>& b)