2012-07-06 8 views
0

나는 거대한 벡터가 boost dynamic_bitset입니다. 나는 dynamic_bitset 벡터를 파일에 쓰고 나중에 파일을 다시 dynamic_bitset 벡터로 읽어 들이기를 원합니다. dynamic_bitset에 대한 메모리가 연속 메모리 블록으로 할당되어 있습니까? (전체 벡터를 순회하지 않고 한 번에 쓸 수 있도록)거대한 부스트 dynamic_bitset 벡터를 파일에 쓰고 다시 읽어들이는 효율적인 방법

비트 세트 벡터의 크기는 수백만입니다. 그래서 요소를 반복하는 대신 파일에 파일을 작성하는 효율적인 방법을 찾고 있습니다.

dynamic_bitset을 문자열로 변환 한 다음 문자열을 파일에 기록했습니다. 나중에 파일에서 문자열을 읽고이를 다시 dynamic_bitset으로 변환합니다. 문자열로 저장

#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; 
} 

그러나 심지어이 방법 파일에 기록하는 데 시간이 오래 걸립니다 : 아래

내가 비주얼 스튜디오를 사용하여 C++로 작성한 코드입니다. 파일에서 문자열로 다시 읽으려고하면 "처리되지 않은 액세스 위반 예외"가 발생합니다. 같은 것을 구현하는보다 효율적인 방법이 있습니까?

답변

1

hm ... mb 사용 연산자 < < 및 연산자 >>?

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)