流狀態管理:避免重複讀取最後一行
使用ifstream 從檔案讀取時,正確管理流狀態至關重要以避免意外行為,例如將最後一行讀兩次。
為什麼要雙讀發生
在循環條件中使用 f.good() 或 !f.eof() 會導致最後一行被讀取兩次。這是因為:
檔案結尾可能存在不完整或格式錯誤的行,導致 getline 失敗。如果在循環條件中使用 f.good() 或 !f.eof(),即使 getline 失敗,循環也會繼續,導致重新讀取最後一個有效行。
正確的流狀態管理
為了避免此問題,應在執行所需的輸入操作後檢查流狀態。這可以使用以下技術來完成:
getline之後:
if (getline(stream, line)) { use(line); } else { handle_error(); }
之後運算子>>:
if (stream >> foo >> bar) { use(foo, bar); } else { handle_error(); }
要讀取和處理所有行,建議使用以下循環構造:
for (std::string line; getline(stream, line);) { process(line); }
此循環自動終止當getline 無法讀取另一行時。
注意事項good()
good() 函數的命名可能會產生誤導。它僅表明到目前為止沒有遇到錯誤,但並不意味著下一步操作會成功。因此,一般不建議使用good()來預測未來輸入操作的結果。
以上是在 C 中使用 ifstream 時如何避免重複讀取最後一行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!