如何检查CArchive是否有效

How to check if CArchive is valid

本文关键字:CArchive 是否 有效 检查 何检查      更新时间:2023-10-16

我使用MFC-Serialize函数来读取/存储一些值。如果我捕获错误的文件名,应用程序崩溃。

我看到这通常是因为,它试图读取超出CArchive(文件)末尾的内容,并返回一些初始化的值。

如何检查CArchive提取后是否仍然有效?或者到达了档案库的尽头。与ifstream类似if (is) is>> tmp.

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提取时出现浮点异常(尽管try, catch处理程序会导致程序崩溃)。我现在通过在CString中转换浮点数/双精度数并在my>>和<<中使用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;
}