測試流條件:為什麼使用good() 或!eof() 讀取最後一行兩次
嘗試讀取文字檔時使用ifstream 逐行,在循環中使用f.good() 或!f.eof() 可能會導致最後一行讀取兩次。讓我們深入研究這種行為背後的原因並探索替代解決方案。
了解流狀態函數
good()、eof() 和 failed() 是流狀態指示輸入流當前狀態的函數。然而,它們並不能預測未來輸入操作的成功或失敗。
兩次讀取最後一行的原因
問題的發生是因為 good() 和 eof( )不一定反映最後輸入運算的結果。例如,!f.eof() 不保證前面的 getline() 成功。相反,不在 EOF 並不意味著上次輸入操作失敗。
替代解決方案:在輸入操作後檢查流狀態
要正確讀取和處理行,執行輸入後檢查流狀態至關重要操作:
if (getline(f, line)) { // Use line here } else { // Handle error or end of file }
替代解決方案:使用循環迭代
另一個優雅的解決方案是使用迭代直到getline() 失敗的循環:
for (string line; getline(f, line);) { // Use line here }
避免錯誤命名good()函數
最後,要注意的是,good() 是一個用詞不當,並不等於測試流本身。建議使用上述技術,而不是依賴 good()。
以上是為什麼使用`good()`或`!eof()`會讀取檔案的最後一行兩次?的詳細內容。更多資訊請關注PHP中文網其他相關文章!