測試流輸入狀態與未來的成功
使用流讀取輸入時,了解測試流狀態和預測之間的區別至關重要未來營運的成功。
問題:閱讀最後一行兩次
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中文網其他相關文章!