MFC-Serialize関数を使用していくつかの値を読み書きします。 ファイル名が間違っていると、アプリケーションがクラッシュします。CArchiveが有効かどうかを確認する方法
これは通常、CArchive(ファイル)の終了をbeyoundで読み込み、いくつかの単位化された値を返すためです。
抽出後にCArchiveが有効かどうかを確認するにはどうすればよいですか?またはCArchiveの終わりに達する。 ifstrem if(is)is >> tmpと似ています。 CArchive(プログラムの開発がクラッシュし、試しにもかかわらず、catchハンドラ)から抽出しながら、浮動小数点例外を回避するために
std::vector<double> m_vecPoint;
void CTestDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{ // Store
int AnzT = m_vecPoint.size();
ar << AnzT;
for (int i = 0; i < AnzT *&& *ar.isGood()*/; i++)
{
ar << m_vecPoint.at(i);
}
}
else
{ // Read
int AnzT(0);
ar >> AnzT;
for (int i = 0; i < AnzT; i++)
{
double pt;
ar >> pt;
m_vecPoint.push_back(pt); // crash occurs here (how to validate pt?) }
}
}
*「抽出後にCArchiveが有効かどうかを確認するにはどうすればよいですか」* - 意味がありません。なぜあなたは気にしますか?逆シリアル化が成功した場合、アーカイブオブジェクトはもう必要ありません。そうでない場合は、途中で例外がスローされます(シリアライゼーションコードが例外をスローすると仮定します)。あなたは本当に解決しようとしている問題は何ですか? – IInspectable
ar >> ptとm_vecPoint.push_back(pt)の間で例外が発生するので、意味があります。 例外は "浮動小数点アンダーフロー"で、try..catchで捕捉できません。 –
整数だけを扱うときに浮動小数点例外が発生する理由は分かりません。確かに正しいとは言えません。いずれにしても早期にエラーを解決するには、バージョン管理可能なスキーマを使用します([シリアライズ:シリアライズ可能クラスの作成](https://msdn.microsoft.com/en-us/library/00hh13h0.aspx)を参照))。参考になる追加情報については、[TN002:Persistent Object Data Format](https://msdn.microsoft.com/en-us/library/32wxt301.aspx)を参照してください。 – IInspectable