測試檔案輸入的流狀態:避免雙重讀取
從檔案讀取資料時,必須避免多次讀取同一行次。但是,在讀取之前檢查諸如 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中文網其他相關文章!