2016-11-01 4 views
0

부스트 라이브러리를 사용하여 std :: map을 직렬화하여 파일에 저장할 수 있도록하려고합니다. 그러나 나는 그렇게 이상한 행동을하고있다 (나는 짐작한다). 그래서 여기 내 코드입니다 :부스트 라이브러리를 사용한 직렬화

#include <map> 
#include <fstream> 
#include <iostream> 
#include <bitset> 

#include <boost/serialization/map.hpp> 
#include <boost/archive/text_iarchive.hpp> 
#include <boost/archive/text_oarchive.hpp> 

std::map<int,int> map = {{65,2}, {69,1}, {75,1} ,{77,1}, {82,1}, {84,2}, {89,2}}; 

void saveMapToFile(std::ofstream& f); 

int main() 
{ 
    std::ofstream f("test.txt", std::ios::binary); 

    saveMapToFile(f); 

    std::cout << "position: " << f.tellp() << std::endl; 
} 

void saveMapToFile(std::ofstream& f) 
{ 
    std::cout << "position : " << f.tellp() << std::endl; 

    boost::archive::text_oarchive oarch(f); 

    std::cout << "position : " << f.tellp() << std::endl; 

    oarch << map; 

    std::cout << "position : " << f.tellp() << std::endl; 
} 

는 그리고 여기에 위의 코드의 출력 :

position : 0 
position : 28 
position : 75 
position: 76 

그래서 누군가가 여기서 무슨 일이 일어나고 있는지 나에게 설명 할 수는? 다른 위치에지도를 삽입 한 후 위치가 왜 (기능상)? 추가 opperations, 아직 그 포인터가 한 바이트 더 나아 간다 ... 나는 뭔가를 놓친 건가? 사전에 도움을 주셔서 감사합니다.

답변

0

왜 내가 아카이브 형식의 구현에 대한 가정을하는지 알지 못합니다.

아카이브 헤더를 작성하고 "예고편"(XML 아카이브라고 생각할 수 있음)을 작성할 수 있습니다.

소멸자 oarch은 다른 바이트를 작성하여 스트림을 완료했습니다. 그것은 센티널, 체크섬, 개행 등일 수 있습니다.

+0

그래,하지만 이해가 안되는 이유는 모르겠다. 내가 그 파일을지도에있는 다른 데이터를 저장하고 그 문제가 있음을 의미합니다. 저장은 어디에서 실행해야합니까? ''saveMapToFile()'''함수에서 다른 데이터를 저장하면 75 번째 바이트부터 시작하고 765 번째 바이트는 외부에서 수행합니다. 다음 읽기 -지도를 읽은 후 포인터 위치는 항상 75 번째 바이트로 이동하지만 다른 데이터는 76 번째 바이트부터 시작할 수 있으므로 그 순간에는 데이터 읽기를 시작하거나 다음 바이트로 이동해야합니다. 그리고 나서 읽으십시오. 아마 내가 이해할 수없는 것입니다. –

+0

저장 기능에 스트림이 아닌 아카이브를 전달해야합니다. – sehe

+1

[이 답변] (https://stackoverflow.com/a/28395831/85371)의 맨 아래 링크를 참조하십시오. [다형성 텍스트 아카이브보다 많은 것을 출력] (http://stackoverflow.com/questions/) 27422557/more-more-a-polymorphic-text-archive/27424381 # 27424381) 및 [스트림은 아카이브가 아닙니다] (http://www.boost.org/doc/libs/1_51_0/libs/serialization/) 의사/) – sehe

관련 문제