如何检查CArchive是否有效

时间:2016-08-12 14:15:54

标签: c++ mfc

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

我看到通常是因为,它尝试读取beyound CArchive(文件)的末尾并返回一些单元化的值。

如何在提取后检查CArchive是否仍然有效?或达到CArchive的结尾。 与ifstrem类似,if(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?)               }
    }
}

1 个答案:

答案 0 :(得分:-2)

在从CArchive中提取时避免浮点异常(程序崩溃,尽管尝试,捕获处理程序)。我现在通过在CString中转换浮点数/双打并在我的&gt;&gt;中使用ar.Write / ReadString(str)来避免这种情况。和&lt;&lt;运算符。

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;
}