Эффективный способ записать огромный вектор boost_bitset в файл и прочитать его обратно
У меня есть огромный вектор повышения dynamic_bitset. Я хочу записать вектор dynamic_bitset в файл, а затем прочитать файл обратно в вектор dynamic_bitset. Выделена ли память для dynamic_bitset как непрерывный блок памяти (чтобы я мог записать весь вектор сразу, не пересекая)?
Размер вектора битов составляет порядка миллионов. Поэтому я ищу эффективный способ записать их в файл, а не перебирать элементы.
Я преобразовал dynamic_bitset в строку, а затем записал строку в файл. Позже прочитайте строку из файла и конвертируйте ее обратно в dynamic_bitset.
Ниже приведен код, написанный на C++ с использованием Visual Studio:
#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 ответ
Хм... мб использовать оператор << и оператор >>?
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)