1. ホーム
  2. c++

[解決済み] テキストファイルからEOFまで読み込むと最終行が繰り返される【重複

2022-02-16 12:50:40

質問

以下は C++ のコードでは ifstream オブジェクトを使用して、テキストファイル(1行に1つの数値)から整数を読み込みます。 EOF . なぜ最終行の整数を2回読んでしまうのでしょうか?これを修正する方法は?

コード

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    ifstream iFile("input.txt");    // input.txt has integers, one per line

    while (!iFile.eof())
    {
        int x;
        iFile >> x;
        cerr << x << endl;
    }

    return 0;
}

input.txt :

10  
20  
30

出力 :

10  
20  
30  
30

備考 : コードスニペットを小さくするために、エラーチェックのコードをすべてスキップしています。上記の動作は、Windows (Visual C++)、cygwin (gcc)、Linux (gcc)で確認されています。

解決するには?

イベントの連鎖をよく見てください。

  • 10をつかむ
  • グラブ20
  • グラブ30
  • グラブEOF

最後から2番目の繰り返しに注目してください。 30を掴んでからEOFのチェックに移行していますね。 EOFマークがまだ読み込まれていないので、EOFに到達していません("binarically"で言えば、概念的には30行目のすぐ後です)。 したがって、次の反復処理に進みます。x は前の反復処理の 30 のままです。 xは30行目のままであり、ios::eofbitが発生する。 x は 30 のままで、ios::eofbit が発生します。x を標準エラー出力します(前の反復と同じように 30 です)。 次にループの条件でEOFをチェックすると、今度はループから抜け出します。

これを試してみてください。

while (true) {
    int x;
    iFile >> x;
    if( iFile.eof() ) break;
    cerr << x << endl;
}

ところで、あなたのコードにはもう一つバグがあります。 空のファイルに対して実行したことはありますか? あなたが得た動作は、まったく同じ理由によるものです。