2016-11-01 3 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をしていない、まだそのポインタは1バイト進む...私は何かを欠いている?あなたの助けを前もってありがとう。

答えて

0

なぜアーカイブ形式の実装について仮定しているのかわかりません。

アーカイブヘッダーをアーカイブし、「予告編」(XMLアーカイブと考える)を書くことができます。

デストラクタoarchは別のバイトを書き込み、ストリームを終了しました。それは、センチネル、チェックサム、改行などになる可能性があります。

+0

ええ、私はそれを理解していますが、なぜそれが矛盾しているのか分かりません。私はそのマップの後に他のデータをファイルに保存したいのですが、それに問題があります。どこでそのストアを実行する必要がありますか? '' saveMapToFile() '' 'という関数で他のデータを保存すると、75番目のバイトから開始し、それ以外の場合は76番目のバイトになります。その後、私が地図を読んだ後、ポインタの位置は常に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/) doc /) – sehe

関連する問題