2

コードは次のとおりです。

ifstream fin("D://abc.txt", ios::in);
string line;
while ( fin ) {
    getline( fin, line );
    cout << line << endl;
}

テキストファイルは次のとおりです。

hi, I am Eric!
hi, I am Jack!

そして、出力は

hi, I am Eric!
hi, I am Jack!
hi, I am Jack!

そして、条件を に変更すると!fin.eof()、出力は正しくなります。の有効な状態?eofifstream

4

3 に答える 3

4

関数がstd::getline失敗するまで状態が変更されないためです。これは、最初の 2 行を正しく読んだことを意味しますが、状態は変更されないため、再度ループに入りますが、std::getline呼び出しは失敗しますが、チェックは行わず、eofフラグが設定されています。

あなたがすべき例えば

while (std::getline(...))
{
    // ...
}
于 2013-07-29T08:27:01.203 に答える
3

ストリームの最後を超えて読み込もうとした場合にのみ、このeof状態に到達します。ファイルから最後の行を読み取る呼び出しはそうしません (改行まで読み取ります)。しかし、ループの次の繰り返しでの呼び出しは、ファイルの最後に到達します。getlinegetline

ファイル内のすべての行を読み取るより良い方法は次のとおりです。

while (getline(fin, line)) {
    cout << line << endl;
}
于 2013-07-29T08:28:04.533 に答える
1

使い方

while(fin)

よくない。fin が最後に到達したかどうかではなく、fin の値をチェックします。

このページを確認してください: http://www.cplusplus.com/reference/string/string/getline/

関数 getline の 2 回目の呼び出しを終了すると、ポインター fin は NULL を指していないため、3 回目の呼び出しで while の 3 番目のプロセスに入ります。

getline(fin,line);

fin の eof を満たすため、fin の状態が変化し、4 回目の呼び出しには進みませんが、値をクリアしていないためです。

line

したがって、それも印刷されます

hi, I am Jack!
于 2013-07-29T08:37:45.713 に答える