[英]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.