首頁 > 後端開發 > C++ > 在 C 中使用 ifstream 時如何避免重複讀取最後一行?

在 C 中使用 ifstream 時如何避免重複讀取最後一行?

Barbara Streisand
發布: 2024-12-13 22:31:11
原創
834 人瀏覽過

How Can I Avoid Double-Reading the Last Line When Using ifstream in C  ?

流狀態管理:避免重複讀取最後一行

使用ifstream 從檔案讀取時,正確管理流狀態至關重要以避免意外行為,例如將最後一行讀兩次。

為什麼要雙讀發生

在循環條件中使用 f.good() 或 !f.eof() 會導致最後一行被讀取兩次。這是因為:

  • f.good(): 僅檢查到目前為止是否沒有遇到錯誤,但不指示是否進行下一個操作(例如getline)將成功。
  • !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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板