ホームページ >バックエンド開発 >C++ >テキスト ファイルを読み取るときに EOF チェックが最後の行を繰り返すのはなぜですか?

テキスト ファイルを読み取るときに EOF チェックが最後の行を繰り返すのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-31 12:18:09785ブラウズ

Why Does My EOF Check Repeat the Last Line When Reading a Text File?

重複バグ: EOF がテキスト ファイル読み取りの最後の行を繰り返す

問題のコードは、テキスト ファイルから 1 行ずつ整数を読み取ることを目的としています。ファイルの終わり (EOF) インジケーターに達するまで。ただし、最後の反復では予期せず最後の整数を 2 回読み取ります。

問題の根本:

問題はファイル読み取りの性質にあります。入力ストリームが EOF マークに達すると、ios::eofbit が発生します。このビットは、ストリームがファイルの最後にあるということではなく、最後の読み取り操作で EOF が発生したことを示します。

詳細な分析:

次のイベント シーケンスを考えてみましょう。 :

  1. 整数 10 を読み取ります。
  2. 整数を読み取ります整数 20.
  3. 整数 30 を読み取ります。
  4. 30 を読み取り後に 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。