hur.cn - 华软网

 热门搜索

捕捉不到CArchiveException endOfFile的异常

  作者:未知    来源:网络    更新时间:2011/8/11
vs2008,在while循环为FALSE的情况下,他会报一个CArchiveException endOfFile的异常
但是我加了TRY CATCH以后,却捕捉不到这个异常
代码很简单,给出解决方案之前,麻烦先自己试一下

代码如下:
C++">CFile file;

file.Open(m_strFileName, CFile::modeRead);

CArchive arf(&file, CArchive::load);

TRY
{
CString rString;

while(arf.ReadString(rString))
{
m_arrContent.Add(rString);
}
}
CATCH(CArchiveException, e)
{
if (e->m_cause & CArchiveException::endOfFile)
{
AfxMessageBox("You have reached the end of the file!");
}

}
END_CATCH

---华软 网友回答---
EOF会导致ReadString返回0,正常退出循环。
---华软网友回复---
vc6测试的。
---华软网友回复---
用一个变量读取arf.ReadString(rString)返回值,然后再处理.EOF应该也会有一个返回值
---华软网友回复---
CATCH(CArchiveException, e)
{
if (e->m_cause == CArchiveException::endOfFile)
{
DELETE_EXCEPTION(e);
if (nRead == 0)
return NULL;
}
else
{
THROW_LAST();
}
}
mfc代码里把eof屏蔽了?
---华软网友回复---
使用的是BOOL ReadString(
   CString& rString 
);
返回值就是BOOL类型的

这个异常并不影响使用,只是在调试的时候,会在vs2008的即时窗口显示一条异常信息,看看有没有办法去掉
---华软网友回复---
VS2005也是一样。MS在内部被DELETE掉了。
LPTSTR CArchive::ReadString(__out_ecount_z_opt(nMax+1) LPTSTR lpsz, UINT nMax)
{
// if nMax is negative (such a large number doesn't make sense given today's
// 2gb address space), then assume it to mean "keep the newline".
int nStop = (int)nMax < 0 ? -(int)nMax : (int)nMax;
ASSERT(AfxIsValidAddress(lpsz, (nStop+1) * sizeof(TCHAR)));

if(lpsz == NULL)
return NULL;

_TUCHAR ch;
int nRead = 0;

TRY
{
while (nRead < nStop)
{
*this >> ch;

// stop and end-of-line (trailing '\n' is ignored)
if (ch == '\n' || ch == '\r')
{
if (ch == '\r')
*this >> ch;
// store the newline when called with negative nMax
if ((int)nMax != nStop)
lpsz[nRead++] = ch;
break;
}
lpsz[nRead++] = ch;
}
}
CATCH(CArchiveException, e)
{
if (e && e->m_cause == CArchiveException::endOfFile)
{
DELETE_EXCEPTION(e);
if (nRead == 0)
return NULL;
}
else
{
THROW_LAST();
}
}
END_CATCH

lpsz[nRead] = '\0';
return lpsz;
}

好像也没啥解决方案。蹭分~
---华软网友回复---
调试窗口是显示的first-chance exception吧?这个没关系的。
---华软网友回复---
调试窗口是显示的first-chance exception吧?这个没关系的。
---华软网友回复---
引用 8 楼 ndy_w 的回复:
调试窗口是显示的first-chance exception吧?这个没关系的。


我也觉得没啥关系,就是看着不爽,洁癖
---华软网友回复---
用这个重载的函数
LPTSTR ReadString(
   LPTSTR lpsz,
   UINT nMax 
);

In the version that returns an LPTSTR, a pointer to the buffer containing the text data; NULL if end-of-file was reached. 

---华软网友回复---
引用 10 楼 visualeleven 的回复:
用这个重载的函数
LPTSTR ReadString(
  LPTSTR lpsz,
  UINT nMax 
);

In the version that returns an LPTSTR, a pointer to the buffer containing the text data; NULL if end-of-file was reached.


还是会存在,看上面贴出的源代码,这个异常应该是出在ReadString内部,应该是避免不了了,呵呵      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。