首頁 >後端開發 >C++ >使用 C 檔案輸入流時如何避免重複讀取行?

使用 C 檔案輸入流時如何避免重複讀取行?

Barbara Streisand
Barbara Streisand原創
2024-12-15 13:28:16229瀏覽

How Can I Avoid Double-Reading Lines When Using C   File Input Streams?

測試檔案輸入的流狀態:避免雙重讀取

從檔案讀取資料時,必須避免多次讀取同一行次。但是,在讀取之前檢查諸如 good() 或 !eof() 之類的流狀態可能會導致意外行為。

考慮以下程式碼:

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

此程式碼旨在讀取所有行從檔案開始直到到達結尾。但是,它會讀取最後一行兩次。要理解原因,我們需要深入研究流狀態標誌的內部結構。

流狀態標誌

good()、eof()、fail() 和bad() 是指示輸入流當前狀態的流狀態標誌。 good() 標誌通常期望指示流是否處於有效狀態以供進一步讀取,但這並不嚴格準確。更準確的描述是不存在錯誤或文件結束條件。

good() 和!eof() 的問題

當您檢查流時.good() 或!stream.eof() 在讀取之前,您不會詢問流下一次讀取操作是否會成功。您僅查詢目前狀態。

例如,當從檔案讀取最後一行時,會設定 eof() 標誌。但是,good() 標誌可能仍然為 true,表示上次讀取期間沒有發生錯誤。

為了避免重複讀取,正確的做法是讀取操作後測試流:

// Read all lines from a file
for (std::string line; getline(f, line);) {
  process(line);
}

// Read an integer and store it in foo
int foo;
if (f >> foo) {
  use(foo);
} else {
  handle_error();
}

此方法可確保您只處理從檔案中成功讀取的資料。

以上是使用 C 檔案輸入流時如何避免重複讀取行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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