2016-08-12 15 views
0

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?)    } 
    } 
} 
+0

*「抽出後にCArchiveが有効かどうかを確認するにはどうすればよいですか」* - 意味がありません。なぜあなたは気にしますか?逆シリアル化が成功した場合、アーカイブオブジェクトはもう必要ありません。そうでない場合は、途中で例外がスローされます(シリアライゼーションコードが例外をスローすると仮定します)。あなたは本当に解決しようとしている問題は何ですか? – IInspectable

+0

ar >> ptとm_vecPoint.push_back(pt)の間で例外が発生するので、意味があります。 例外は "浮動小数点アンダーフロー"で、try..catchで捕捉できません。 –

+0

整数だけを扱うときに浮動小数点例外が発生する理由は分かりません。確かに正しいとは言えません。いずれにしても早期にエラーを解決するには、バージョン管理可能なスキーマを使用します([シリアライズ:シリアライズ可能クラスの作成](https://msdn.microsoft.com/en-us/library/00hh13h0.aspx)を参照))。参考になる追加情報については、[TN002:Persistent Object Data Format](https://msdn.microsoft.com/en-us/library/32wxt301.aspx)を参照してください。 – IInspectable

答えて

-2

。 CStringの浮動小数点数/倍精度を変換し、演算子>>および< <演算子内でar.Write/ReadString(str)を使用することで、これを避けることができます。

inline Archive& operator<<(CArchive& ar, const CMyPoint& val) 
{ 
    tostringstream os; 
    const TCHAR kSep = _T(' '); 

    os << val.m_fTemperatur1 << kSep; 
    os << val.m_fTemperatur2 << kSep; 

    ar.WriteString(os.str().c_str()); 
    return ar; 
} 

inline CArchive& operator >> (CArchive& ar, CMyPoint& val) 
{ 
    CString str; 
    ar.ReadString(str); 

    tistringstream is((LPCTSTR)str); 
    tstring sep; 
    is >> val.m_fT1 >> sep; 
    is >> val.m_fT2 >> sep; 

    return ar; 
} 
+2

そして、異なるロケールはどうですか?あなたはいくつかの国が小数点としてコンマを持っていることを聞いたことがありますか?私のコードでこのコードを見ると、このコードは私を怒らせるでしょう... – xMRi

+0

それは私が読んだ自分のデータです。自分のデータを読んでも問題はありません。しかし、私やユーザーが誤って間違ったファイルを選択すると、プログラムがクラッシュします。私の唯一の目的は、プログラムのクラッシュを避けることです。このスキーマは私のために働いた。どのように浮動小数点例外をキャッチしますか? –

+0

1人のユーザーがあるロケール設定で格納されているファイルを別のロケール設定を使用しているユーザーと交換するとどうなりますか?これは解決策ではありません。それはクルージングでもありません。新しいバグのいくつかを導入しなくてもよいバグを修正しようとしています。既に何回もコメントされています。あなたのクラスに**適切な**シリアライゼーションサポートを実装してください。問題はありません。 'CArchive'実装は、シリアライズされたストリームに型情報を保持していれば、無効なストリームが提示されたときにそれを知ります。ストリーム演算子のオーバーロードによって、この型情報が削除されます。 – IInspectable

関連する問題