2013-04-18 4 views
14

std :: map을 가지고 있습니다.C++ std :: map serialize/deserialize

필자가 fwrite를 사용하여 1 줄처럼 파일에 쓸 수 있는지, 파일에서 읽을 수 있는지 알고 싶습니다. 또는 각 값을 별도로 쓰거나 읽어야 할 필요가 있는지 알고 싶습니다.

나는 특별한 것이 없기 때문에 이것이 가능할 것으로 기대하고있었습니다.

+1

직렬화는 완전히 간단한 작업은 아닙니다. 그러나 그것은 전에 행해졌습니다. 예를 들어 [boost :: serialization] (http://www.boost.org/doc/libs/1_53_0/libs/serialization/doc/index.html)을보십시오. 'std :: maps'를 포함하여 표준 라이브러리 컨테이너를 직렬화 할 준비가 된 코드가 함께 제공됩니다. – juanchopanza

+1

'fwrite'는 C-ism입니다. –

답변

24

boost::serialization을 한 줄로 serialize하십시오. 그것을 위해 헤더 : 대신 text_archive의 파일에 대한

g++ -o new new.cpp -std=c++0x -lboost_serialization 
./new 
1 

단순히 대신 std::stringstreamstd::ifstream/std::ofstream을 사용하고 binary_archive을 할 수있다 :

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

int main() 
{ 
    std::map<int, int> map = {{1,2}, {2,1}}; 
    std::stringstream ss; 
    boost::archive::text_oarchive oarch(ss); 
    oarch << map; 
    std::map<int, int> new_map; 
    boost::archive::text_iarchive iarch(ss); 
    iarch >> new_map; 
    std::cout << (map == new_map) << std::endl; 
} 

출력

boost/serialization/map.hpp 

코드 예제.

1

지도를 직렬화하는 한 줄 짜기는 없습니다. 각 키/값 쌍을 개별적으로 작성해야합니다. 이것은 for 루프보다 훨씬 복잡합니다.

부스트를 사용하면 방법이있을 수 있지만 정확한 API에 익숙하지 않습니다.