繁体   English   中英

如何检查CArchive是否有效

[英]How to check if CArchive is valid

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

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

提取后如何检查CArchive是否仍然有效? 或到达CArchive的末尾。 与ifstrem类似,如果(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提取数据时出现浮点异常(尽管尝试了catch处理程序,程序还是崩溃了)。 我现在通过在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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM