2010-12-12 4 views
5

std :: stringを含む任意のSTLクラスをシリアル化できますか?私はstd :: stringsのセットを持っていて、ファイルに書き込んでstd :: setに戻そうとしています。STLクラスのシリアル化

答えて

10

はい、可能です。例えば、boost.serializationとなります。 STLについては

、あなただけのファイルにstd::set<std::string>を書き、裏にそれを読んで、あなたのプロジェクトがすでにブーストを使用していないしたい場合は、シンプルなものを試してみてくださいcorresponding tutorial section

+0

私は文字列で行うことができました。たとえば、セットで直接行うことはできますか? – user963241

+2

@cpx: '#include ' – Abyx

+0

彼はSTLコンテナを持つクラスを作る例は望んでいません。彼はSTLコンテナを取得してファイル。 –

4

をお読みください。

ofstream file("file.txt"); 
copy(theSet.begin, theSet.end(), ostream_iterator<string>(file, "\n")); 

これは、文字列を1行に1つずつテキストファイルに書き込むだけです。そして、それらを読むために:

ifstream file("file.txt"); 
string line; 
while(getline(file, line)) 
    theSet.insert(line); 
+2

これらの文字列に改行が含まれているとどうなりますか?それは非常に悪い考えです... –

+1

もちろん、文字列に改行が含まれていれば、これは動作しません。私はOPの賭けをしても構わないと思う。 –

+0

代わりにヌル文字で区切りますか? Cの文字列は通常それらを含んでいません。 –

4

ブーストを使用する例を::

g++ -lboost_serialization myfile.cc 

注意してSTLタイプ

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

#include <boost/serialization/map.hpp> 

int main(int argc,char** argv) { 
    std::ofstream s("tmp.oarchive"); 
    boost::archive::text_oarchive oa(s); 
    std::map<int,int> m; 
    m[1] = 100; 
    m[2] = 200; 
    oa << m; 
} 

コンパイルをシリアル化するためにシリアライズ

  1. こと#include <boost/archive/text_iarchive.hpp>は他のものの前にある必要がありますシリアル化にはが含まれます。
  2. アーカイブするSTLタイプのヘッダーを含める必要があります。
1

これを確認してください。 liteの十分な

STL serialization

ONLY ONE CPPファイルNEEDED

が、そこにサポートのシリアル化を行うはlibいくつかのprotobufferのように、ブーストがある

liteのシリアル化ソリューション:シリアライズ、私にとっては重すぎます。私はこのライト版を書いた。

サポート

  • ベクトル
  • マップ
  • 文字列
  • プリミティブ(int型、ダブル、ロング、...)
  • エンディアンサポート
  • ネスティングコンテナサポートを設定します

使用文字の代わりにBOOL STL why

であなたはCMakeのことで、このプロジェクトをビルドすることができます

を構築します。あなたのプロジェクトにserialization.hをインポートするだけです。

はCHECK_ENDIAN = 1であれば、あなたのwannaチェックエンディアン

デモ

チェックtestSerialization.cpp

来のSOOM

エンディアン変換定義します。

関連する問題