使用 CArchive 讀取文件時,無法直接判斷 EOF,嘗試讀取超出末尾會拋出異常。常見代碼:
while (1) {
ca >> sno; // 讀到末尾拋出 CArchiveException
}
try {
while (true) {
ca >> sno;
// 處理數據
}
} catch (...) {
// 到達文件末尾或其他異常
}
try {
while (true) {
ca >> sno;
// 處理數據
}
} catch (CArchiveException* e) {
if (e->m_cause == CArchiveException::endOfFile) {
// 正常讀取完畢
} else {
// 其他存檔異常:generic, badSchema, readOnly 等
AfxMessageBox(_T("讀取文件錯誤"));
}
e->Delete(); // 必須手動刪除 MFC 異常對象
}
利用 CFile 配合 CArchive 的 GetFile() 獲取文件長度,預先判斷讀取位置:
CFile file(_T("data.dat"), CFile::modeRead);
CArchive ar(&file, CArchive::load);
ULONGLONG fileLen = file.GetLength();
while (file.GetPosition() < fileLen) {
ar >> sno;
// 處理數據
}
CArchiveException 是指針類型,捕獲後必須 Delete()。Flush() 確保數據落盤。