0

重複の可能性:
ループ条件内の iostream::eof が間違っていると見なされるのはなぜですか?

cin.get() を介して文字のグループを読み取っていたところ、cin.get() が入力の最後に余分な文字を取得していることに気付きました。これを修正する方法を知っている人はいますか?これが私のコードです:

unsigned char c;

while(!cin.eof())
{
   c = cin.get();
   cout << (int)c << endl;
}

私の問題は、取得する文字が255のASCII値の1つであることです。私は単にこの余分な文字を取得したくないのですが、ユーザーが最後にゴミ文字にならずに 255 の ascii 値を入力した場合、それで問題ありません。私の出力の例は次のとおりです。

出力に abc\n と入力した場合:

私は97 98 99 10 255を取得します

でも欲しい: 97 98 99 10

これを修正する方法についてのアイデアはありますか? ありがとう!

4

2 に答える 2

3

cin.eof()ループ条件として使用しないでください。ここにあるように、ほとんどの場合、バグのあるコードが生成されます。

代わりに、次を試してください。

int c;
while ( (c=cin.get()) != EOF ) {
  cout << c << endl;
}

または:

char c;
while (cin.get(c)) {
  cout << (int)c << endl;
}
于 2012-12-03T18:54:21.873 に答える
3

引数のget()ない関数は、int_typeではなくを返しますchar。ストリームの最後に、ファイルの終わりを示す特殊な非文字値 (通常は -1) を返します。cin.get()の結果を に直接代入すると、unsigned charこの eof 情報をうっかり捨ててしまいます。関連するドキュメントの引用は次のとおりです。

1) 1 文字を読み取り、可能であればそれを返します。それ以外の場合は、 を返しTraits::eof()、 および を設定failbiteofbitます。

于 2012-12-03T18:55:02.443 に答える