cin.get获得一个额外的角色?

时间:2012-12-03 18:46:17

标签: c++ io cin

  

可能重复:
  Why is iostream::eof inside a loop condition considered wrong?

我正在通过cin.get()读取一组字符,我注意到我的cin.get()在输入结束时得到了一个exra字符。可能有人知道如何解决这个问题?这是我的代码:

unsigned char c;

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

我的问题是它得到的字符是255 ascii值之一。我只是不希望它获得这个额外的字符,但如果用户输入的ascii值为255而不是最后的垃圾字符,那么这应该没问题。我的输出就是一个例子:

如果我在输出中输入abc \ n:

我明白了 97 98 99 10 255

但我想: 97 98 99 10

有关如何解决此问题的任何想法?谢谢!

2 个答案:

答案 0 :(得分:3)

没有参数的get()函数返回int_type,而不是char。在流的末尾,它返回一个特殊的非字符值,表示文件结束(通常为-1)。通过将cin.get()的结果直接分配给unsigned char,您无意中丢弃了此eof信息。相关文档引用是:

  

1)读取一个字符并返回(如果可用)。否则,返回Traits::eof()并设置failbiteofbit

答案 1 :(得分:2)

Never use cin.eof() as a loop condition。它几乎总是产生错误的代码,就像它在这里一样。

相反,请尝试:

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

或者:

char c;
while (cin.get(c)) {
  cout << (int)c << endl;
}