2013-04-18 40 views
14

私はstd :: mapを持っています。C++ std :: mapをシリアライズ/デシリアライズ from/toファイル

私はfwriteを使って1行のようにファイルに書き込むことができますか(ファイルから読み込むこともできますか)、あるいは各値を別々に読み書きする必要があるかどうかを知りたいと思います。

私は、何も特別なことはないので、これが可能かもしれないと考えていました。

+1

シリアル化は完全に簡単な作業ではありません。しかしそれは前に行われています。例えば、[boost :: serialization](http://www.boost.org/doc/libs/1_53_0/libs/serialization/doc/index.html)を見てください。 'std :: maps'を含むstdライブラリコンテナをシリアライズする準備が整ったコードが付属しています。 – juanchopanza

+1

'fwrite'はC-ismです。 –

答えて

24

boost::serializationを1行でシリアライズします。そのため ヘッダー:

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

出力:ファイルの

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

は単にstd::ifstream/std::ofstreamの代わりstd::stringstreamを使用して、代わりにtext_archivebinary_archiveであってもよいです。

1

マップをシリアル化するためのワンライナーはありません。それぞれのキーと値のペアを個別に記述する必要があります。しかしこれはforループよりもはるかに複雑ではありません。

ブーストを使用すると、方法があるかもしれませんが、私は正確なAPIに精通していません。

関連する問題