2012-11-22 5 views
4

정렬 기본적으로 내가 추적 코드를 바이너리 파일로 비트 세트를 쓰고 How does one store a vector<bool> or a bitset into a file, but bit-wise?C++ (A)의

후속 파일로 dynamic_bitset 저장 : 나는 동적 비트 세트의 방법을 사용

boost::dynamic_bitset<boost::dynamic_bitset<>::block_type> filter; 
vector<boost::dynamic_bitset<>::block_type> filterBlocks(filter.num_blocks()); 

//populate vector blocks 
boost::to_block_range(filter, filterBlocks.begin()); 

ofstream myFile(filterFilePath.c_str(), ios::out | ios::binary); 

//write out each block 
for (vector<boost::dynamic_bitset<>::block_type>::iterator it = 
     filterBlocks.begin(); it != filterBlocks.end(); ++it) 
{ 
    //retrieves block and converts it to a char* 
    myFile.write(reinterpret_cast<char*>(&*it), 
      sizeof(boost::dynamic_bitset<>::block_type)); 
} 
myFile.close(); 

to_block_range를 임시 벡터에 넣은 다음 블록을 파일에 인쇄합니다. 그것은 작동하지만 중간 벡터를 사용할 때 (내 비트 세트와 동일한 크기의 벡터 사용) 내 메모리 사용량이 두 배가됩니다. 메모리 사용량을 두 배로 늘리지 않고 비트 세트를 파일로 인쇄하려면 어떻게해야합니까?

블록에서 비트 세트를 반복 할 수 있다면 좋겠지 만 다른 문제를 방지하기 위해 동적 비트 세트의 작성자는 의도적으로 이러한 종류의 기능을 생략했습니다. 다른 데이터 구조를 사용해야합니까? 컨텍스트에 도움이된다면 필자는 블룸 필터 코드에서 비트 세트를 사용하고 있습니다.

+0

@Potatoswatter 예. 나는 더 분명해야했다. – cjustin

답변

1

수동으로해야합니다. 비트를 반복하여 unsigned char으로 팩하고 stream.put 문자를 파일에 압축합니다.

block_type을 직접 쓰면 파일 형식이 플랫폼 특정 엔디안에 따라 달라 지므로 일반적으로 바람직하지 않습니다. 나는 이것이 나와 즈 제안 내용과 동일 함을 참조하십시오 다른 질문을 보면

(그리고 charblock_type을 설정하면. 성능을 해칠 것), 당신은 대신 std::vector<bool>를 사용하여 다시 가고 싶지 수도.