2016-07-21 7 views
0

아래 예제를 하드 디스크에 간단한 바이너리 파일로 저장하고 싶습니다. 하지만 그물 주위에 나는 그것을 어떻게하는지 간단하고 깨끗한 예제를 찾지 못했습니다. 그래서 질문하고 있습니다 :하드 디스크에 boost :: serialization :: serialize'ble 구조체를 바이너리로 저장하십시오.

구조체를 이진 파일로 이진 파일로 저장하려면 아래의 코드를 어떻게 수정합니까?

#include <vector> 
#include <string> 
#include <bitset> 
#include <boost/serialization/string.hpp> 
#include <boost/serialization/vector.hpp> 
#include <boost/serialization/bitset.hpp> 

template<size_t N> 
struct Example 
{ 
    std::string id; 
    std::vector<std::bitset<N>> bits; 
}; 

template<size_t N> 
Example<N> make_example() 
{ 
    Example<N> example; 

    example.id = "some id"; 

    example.bits.resize(100); 
} 

namespace boost 
{ 
    namespace serialization 
    { 
    template<typename Archive, size_t N> 
    void serialize (Archive & a 
        , Example<N> & e 
        , const unsigned int version) 
    { 
     a & e.id; 
     a & e.bits; 
    } 
    } 
} 

int main() 
{ 
    auto example = make_example<256>(); 

    std::ofstream ofs("filename", std::ios::binary); 

    boost::archive::binary_oarchive oa(ofs); 

    oa << example; // shouldn't use << as oa writes a text archive 
} 

답변

2

나는 문제가 믿는 :

  1. 필요가 make_example()example를 반환 할 수 있습니다. 아마 여기 컴파일러가 무시한다는 경고를 받게 될 것입니다.
  2. #include <boost/archive/binary_oarchive.hpp>이 필요합니다. 그렇지 않으면 컴파일하지 않아야합니다. 이 바이너리 스트리밍되도록 << 지금 boost::archive::binary_oarchive 과부하 때문에

또한, 당신의 의견을 // shouldn't use << as oa writes a text archive은 매우 올바르지 않습니다. SO here 켜짐

#include <vector> 
#include <string> 
#include <bitset> 
#include <fstream> 
#include <boost/serialization/string.hpp> 
#include <boost/serialization/vector.hpp> 
#include <boost/serialization/bitset.hpp> 
// ADD THIS!!! 
#include <boost/archive/binary_oarchive.hpp> 

template<size_t N> 
struct Example 
{ 
    std::string id; 
    std::vector<std::bitset<N>> bits; 
}; 

template<size_t N> 
Example<N> make_example() 
{ 
    Example<N> example; 

    example.id = "some id"; 

    example.bits.resize(100); 
    // ADD THIS!!! 
    return(example); 
} 

namespace boost 
{ 
    namespace serialization 
    { 
    template<typename Archive, size_t N> 
    void serialize (Archive & a 
        , Example<N> & e 
        , const unsigned int version) 
    { 
     a & e.id; 
     a & e.bits; 
    } 
    } 
} 

int main() 
{ 
    auto example = make_example<256>(); 

    std::ofstream ofs("filename", std::ios::binary); 

    boost::archive::binary_oarchive oa(ofs); 

    oa << example; 

    return(0); 
} 

이와 관련된 예 :

따라서 수정 코드처럼 보일 것이다.


업데이트는 SO 6502 here @ 의해 답변을 상기 std::bitset 컴팩트

봐의 바이너리 직렬화를 확인하십시오.

  1. 별도의 loadsave 기능으로 serialize 기능을 분할 : 그런 다음에해야합니다. 예제는 this (자습서 : 저장 /로드로 분할 직렬화하기)을 참조하십시오. save에서
  2. e.bits을 반복하고 std::vector<unsigned char>e.bits[i]를 변환하는 6502의 bitset_to_bytes 기능 @ 사용합니다. 그런 다음 std::vector<std::vector<unsigned char>> (save 함수의 지역 변수)을 갖습니다. 그것을 직렬화하십시오.
  3. 반대로, load의 경우에는 std::vector<std::vector<unsigned char>> (다시 로컬 변수 load)이되도록 직렬화를 해제하십시오. 그런 다음 해당 컬렉션을 반복하고 @ 6502의 bitset_from_bytes<N> 함수를 사용하여 EACHstd::vector<unsigned char>e.bits[i]으로 변환하십시오.
  4. #include <boost/serialization/bitset.hpp>을 제거하면 더 이상 필요하지 않습니다.

이 바이너리 아카이브에 N(N+7)/8 바이트에서 각 std::bitset<N>의 저장을 가지고해야합니다.

희망이 도움이됩니다.

+0

실제로 이전 게시물에서 일부 복사/붙여 넣기 오류가있었습니다. 내가 제안한대로 편집했습니다.프로그램을 실행할 때 genereated 파일 _filename_은 다음과 같은 텍스트 내용을 표시합니다 (~ 25600자를 예상 한대로). '^ @^D^H^D^H^A^@^@^@ @^@ @ @^@^@^^ G^@^@^@^@^@^@^어떤 아이디^@^^ @^@ @^@^^ @ @^@^@^@ @ @^@^@^@^@^@^@^@^@^@^@^@^^ @^@^@^@^@^@^@^0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000^@^@^@^@^@^0 '@ – user1587451

+0

그럼에도 불구하고 여전히 정상적으로 작동하지 않습니다. 파일 크기는 약 26K이지만 256 * 100bit = 3200byte = 3,125K입니다. 파일 크기가 예상보다 8 배 더 큽니다. – user1587451

+1

@ user1587451 실제로 이진 압축 파일입니다. text_oarchive로 변경하고 해당 헤더를 포함하여 차이점을 확인하십시오. 비트 세트로 인해 차이가 조금 있지만 텍스트 보관소에서는 텍스트 메타 데이터가 더 많습니다. – aichao