我使用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?) }
}
}
答案 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;
}