ストリーム入力状態のテストと将来の成功
ストリームを使用して入力を読み取る場合、ストリーム状態のテストと予測の違いを理解することが重要です
問題: 最後の行の読み取りTwice
ifstream f("x.txt"); string line; while (f.good()) { getline(f, line); // Use line here. }
このコードでは、f.good() が getline() が成功するかどうかではなく、現在のストリームの状態をテストするため、最後の行が 2 回読み取られます。 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 とストリーム状態
f.good() の名前が間違っていることに注意してください。これはストリームの「良好さ」を実際に示すものではなく、ストリームが「失敗」または「不良」状態にない場合に true を返します。入力操作を実行した後は、必ずストリーム自体をテストして (つまり、反転した失敗状態を確認して)、成功を確認してください。
以上がC でファイル ストリームから読み取るときにファイルの終わりを正しくテストする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。