首頁 >後端開發 >C++ >在 C 中使用'fstream”時如何防止兩次讀取最後一行?

在 C 中使用'fstream”時如何防止兩次讀取最後一行?

Linda Hamilton
Linda Hamilton原創
2024-12-11 02:32:13677瀏覽

How Can I Prevent Reading the Last Line Twice When Using `fstream` in C  ?

測試fstream 流:使用good() 和eof() 避免兩次讀取最後一行問題

使用fstream 進行檔案輸入操作通常涉及檢查流的狀態以確定何時停止閱讀。但是,使用某些狀態標誌可能會導致意外問題,例如讀取最後一行兩次。本文探討了根本原因並提供了避免此問題的解決方案。

為什麼最後一行被讀取兩次

使用 good() 或 ! 時會出現此問題。使用 getline() 從檔案中讀取行的 while 迴圈內的 eof() 條件。發生這種情況的原因如下:

  • good() 不等於stream.operator bool():儘管有它的名字,good() 並不直接指示流是否是處於良好狀態。相反,它測試 getline() 操作之後的流狀態和緩衝字元。如果其中一個為 false,則 good() 傳回 false。這可能會導致最後一行被讀取兩次,因為即使在最後一行之後沒有更多輸入, getline() 也可能會成功。

修正: 使用getline() 的回傳值檢查是否成功讀取行:

while (getline(stream, line)) {
  // Use line here.
}
  • eof()反映目前state:eof() 檢查流是否已到達檔案結尾(EOF) 位置。然而,到達 EOF 並不一定意味著最後一次 getline() 操作失敗或指示檔案結束。

修補:檢查 getline() 操作是否為在檢查 EOF之前成功:

if (getline(stream, line)) {
  // Use line here.
} else if (stream.eof()) {
  // Handle end-of-file condition.
} else {
  // Handle error condition.
}

最佳實踐

要避免這些問題並有效處理文件行,請考慮以下事項:

  • 使用>>運算子:流的重載,運算子可以檢查輸入操作是否成功或失敗。例如:
if (stream >> foo >> bar) {
  // Use foo and bar here.
} else {
  // Handle error condition.
}
  • 使用明確for 循環:這消除了流狀態檢查的需要:
for (string line; getline(stream, line);) {
  // Use line here.
}

遵循這些準則,您可以避免無意中讀取最後一行兩次,並確保可靠的檔案輸入處理fstream。

以上是在 C 中使用'fstream”時如何防止兩次讀取最後一行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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