2013-04-18 337 views
14

我有一个std :: map。C++序列化/反序列化std :: map <int,int> from/to文件

我想知道我是否可以用fwrite将它写入文件(也可以从文件中读取它),或者如果我需要分别写入/读取每个值。

我希望既然没什么特别的,这可能是可能的。

+1

序列化并不是一项完全平凡的任务。但之前已经完成。例如,查看[boost :: serialization](http://www.boost.org/doc/libs/1_53_0/libs/serialization/doc/index.html)。它带有现成的代码来序列化std库容器,包括'std :: maps'。 – juanchopanza 2013-04-18 06:31:19

+1

'fwrite'是一个C-ism。 – 2013-04-18 06:56:48

回答

24

使用boost::serialization在一行中进行序列化。 部首它:

boost/serialization/map.hpp 

代码示例

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

输出:代替text_archive

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

用于文件简单地使用std::ifstream/std::ofstream代替std::stringstream并且可以是binary_archive,。

1

没有一行可以序列化地图。您需要分别编写每个键/值对。不过,这实际上并不比for循环复杂得多。

使用boost,可能有办法,但我不熟悉确切的API。