だから、ここで私は、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"エラーダイアログが表示されます。それは "式:範囲外のベクトル添え字"です。私はまだそれのソースを調べていないので、それが直接関連しているのか単なる副作用なのかは分かりません。
PS。私は言いたいことは、フォーマット自体ではない場合は、他の場所で干渉が起こる可能性があります(メモリやスタックの破損を考えます)。 – sehe
レイアウトが変わる可能性があることを知りました。私はそれがここの問題だとは思わない。そうだったら、一貫してクラッシュするだろう。結局、同じファイルを読み込んでいます。一度しばらくすると、プログラムは完了まで実行され、期待どおりに動作します。 – user3765410
私はまだ異なるビルド間のバイナリ表現をチェックしたいと思います。両方のビルドがビット単位の同一ファイルにシリアル化されている場合は、[未定義動作](https://en.wikipedia.org/wiki/Undefined_behavior)が他の場所にあることがわかります。そうでない場合、破損したアーカイブを読み込むため、未定義の動作が発生します。 – sehe