重複バグ: EOF がテキスト ファイル読み取りの最後の行を繰り返す
問題のコードは、テキスト ファイルから 1 行ずつ整数を読み取ることを目的としています。ファイルの終わり (EOF) インジケーターに達するまで。ただし、最後の反復では予期せず最後の整数を 2 回読み取ります。
問題の根本:
問題はファイル読み取りの性質にあります。入力ストリームが EOF マークに達すると、ios::eofbit が発生します。このビットは、ストリームがファイルの最後にあるということではなく、最後の読み取り操作で EOF が発生したことを示します。
詳細な分析:
次のイベント シーケンスを考えてみましょう。 :
最後の反復では、整数 30 はまだ現在の値です。入力ストリーム。 EOF に遭遇すると、ios::eofbit が発生しますが、x の値は 30 のままです。コードは、x の値 (30) の出力に進み、ループ条件で EOF をチェックします。 EOF が設定されているため、プログラムはループを終了します。
修正案:
このバグに対処するには、ループ条件をより明示的な EOF チェックに置き換えます。
while (true) { int x; iFile >> x; if (iFile.eof()) break; cerr << x << endl; }
各読み取り操作の後に EOF を明示的にチェックすることにより、コードは最後の
追加のバグ:
元のコードにはエラー チェックもありません。入力ファイルが空の場合、最初の読み取り操作が EOF に達するまで eofbit が発生しないため、ループは終了しません。これを防ぐには、ファイルからの読み取りを試行する前に、適切なエラー処理を追加します。
以上がテキスト ファイルを読み取るときに EOF チェックが最後の行を繰り返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。