2017-10-27 4 views
0

だから、ここで私は、STDをデシリアライズするために使用しているコードの単純なビット::マップブースト、デシリアライゼーションは私に、入力ストリームのエラーを与える

std::map<std::string, std::string> func(std::string filepath) { 
     map<std::string, std::string> filemap; 
     // read file 
     ifstream ifs(filepath, ios::in | ios::binary); 
     if (!ifs.good()) { 
      std::cout << "failed to read file" << std::endl; 
      return filemap; 
     } 

     string content((istreambuf_iterator<char>(ifs)), (istreambuf_iterator<char>())); 

     // deserialize 
     stringstream ss; 
     ss << content; 
     std::cout << "content length: " << content.length() << std::endl; 

     boost::archive::binary_iarchive ia(ss); 
     try { 
      ia >> filemap; 
     } 
     catch (const std::exception& e) { 
      std::cout << e.what() << std::endl; 
     } 
     return filemap; 
    } 

はここに私の心ときめくを作っていることだのです。それはC + +で正常に動作します。 常にです。何度も何度も何度も繰り返します。私はマップをデシリアライズすることができ、私はそれで欲しいものを何でもします。すべての良い。

しかし、私のC++ライブラリはCLIでラップされているので、C#アプリケーションから実行することができます(このようにする必要があります)。前記C#アプリケーションから、「入力ストリームエラー」が発生する。必ずしもそうではなく、20回のうち19回私はそれを実行します。なぜ私の人生が違うのか分かりません。私はすべての私の髪を引き出すことに近いです。

ファイルの読み込み部分は問題ないと思います。私は文字通り「内容」の内容を印刷することができ、それは上手く見えます。

最初のエラーが発生した後、〜5〜10分待っていると、明らかにvector.hの "Debug Assertion Failed"エラーダイアログが表示されます。それは "式:範囲外のベクトル添え字"です。私はまだそれのソースを調べていないので、それが直接関連しているのか単なる副作用なのかは分かりません。

答えて

0

バイナリアーカイブはプラットフォームに依存しません。根本的に異なるコンパイラフラグ(C++ - cliなど)を使用してビルドした場合、レイアウトは互換性がありません。

これ以上のものが必要な場合は、EOS Portable Archiveを使用してください。一方

私は、文字通り "コンテンツ" の内容をプリントアウトすることができ、それはそれはバイナリデータです

正常に見えます。どのように地球上でそれが "うまく見える"ことができますか?あなたがそれが何か知られているものと同じであると言うことができれば、それは "上手く見えます" - それは良いことを証明することができます。そのことを知っていれば、実際にアーカイブの移植性が問題であるという確信があります。

+0

PS。私は言いたいことは、フォーマット自体ではない場合は、他の場所で干渉が起こる可能性があります(メモリやスタックの破損を考えます)。 – sehe

+0

レイアウトが変わる可能性があることを知りました。私はそれがここの問題だとは思わない。そうだったら、一貫してクラッシュするだろう。結局、同じファイルを読み込んでいます。一度しばらくすると、プログラムは完了まで実行され、期待どおりに動作します。 – user3765410

+0

私はまだ異なるビルド間のバイナリ表現をチェックしたいと思います。両方のビルドがビット単位の同一ファイルにシリアル化されている場合は、[未定義動作](https://en.wikipedia.org/wiki/Undefined_behavior)が他の場所にあることがわかります。そうでない場合、破損したアーカイブを読み込むため、未定義の動作が発生します。 – sehe

関連する問題