常見寫法:
while (!feof(fp)) {
fscanf(fp, "%d", &val); // 或 fread
process(val);
}
若文件結尾有換行/空白,最後一筆資料會被處理兩次。
feof() 檢查的是上一次讀取操作是否碰到 EOF,而非「下一次讀取會否碰到 EOF」。feof() 仍回傳 0 (false)。fscanf 讀取失敗(遇到 EOF),不修改緩衝區變數,導致上一次的值被再次處理。feof() 才回傳真,迴圈結束。// 方式一:fscanf 返回成功讀取的項目數
while (fscanf(fp, "%d", &val) == 1) {
process(val);
}
// 方式二:fread 返回實際讀取的項目數
while (fread(&val, sizeof(val), 1, fp) == 1) {
process(val);
}
// 方式三:C++ 風格 (推薦)
ifstream fin("data.txt");
int val;
while (fin >> val) {
process(val);
}
fscanf/fread/operator>>)在嘗試讀取並失敗時才設定 EOF/錯誤旗標,並返回「實際讀取數量」。永遠不要用 `feof()` 控制讀取迴圈。以讀取操作的返回值作為迴圈條件,是 C/C++ 文件處理的鐵律,簡潔、正確、無邊界錯誤。