0

可能重复:
为什么循环条件内的 iostream::eof 被认为是错误的?

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

unsigned char c;

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

我的问题是它得到的字符是 255 ascii 值之一。我只是不希望它得到这个额外的字符,但是如果用户输入 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) 读取一个字符并在可用时返回它。否则,返回Traits::eof()并设置failbitand eofbit

于 2012-12-03T18:55:02.443 回答