首頁 >後端開發 >C++ >在 C 中讀取檔案流時如何正確測試檔案結尾?

在 C 中讀取檔案流時如何正確測試檔案結尾?

Linda Hamilton
Linda Hamilton原創
2024-12-21 15:33:10687瀏覽

How to Correctly Test for End-of-File When Reading from a File Stream in C  ?

測試流輸入狀態與未來的成功

使用流讀取輸入時,了解測試流狀態和預測之間的區別至關重要未來營運的成功。

問題:閱讀最後一行兩次

ifstream f("x.txt");
string line;
while (f.good()) {
  getline(f, line);
  // Use line here.
}

在此程式碼中,最後一行被讀取兩次,因為f.good() 測試目前串流狀態,而不是getline() 是否成功。一旦 getline() 到達 EOF,f 仍處於「良好」狀態,因此即使在讀取最後一行後,迴圈仍會繼續。

解決方案:操作後測試流

相反,在執行輸入操作後檢查流狀態:

ifstream f("x.txt");
string line;
while (getline(f, line)) {
  // Use line here.
}

替代使用eof()

雖然不建議在循環條件中使用eof(),但這裡有一個使用!f.eof() 的等效解:

ifstream f("x.txt");
string line;
while (!f.eof()) {
  if (getline(f, line)) {
    // Use line here.
  } else {
    break;
  }
}

範圍-基於所有行的循環

要讀取和處理所有行,請使用基於範圍的循環:

ifstream f("x.txt");
for (std::string line; getline(f, line);) {
  process(line);
}

Good 與Stream State

請注意,f.good() 命名錯誤。它並不真正指示流的“良好”,而是當流不處於“失敗”或“不良”狀態時返回 true。在執行輸入操作後始終測試流程本身(即檢查其反轉的失敗狀態)以確保成功。

以上是在 C 中讀取檔案流時如何正確測試檔案結尾?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn