【问题标题】:cin.get gets one extra character? [duplicate]cin.get 得到一个额外的字符? [复制]
【发布时间】:2012-12-03 18:46:16
【问题描述】:

可能重复:
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 值之一。我只是不希望它得到这个额外的字符,但如果用户输入 255 的 ascii 值而不是最后的垃圾字符,那应该没问题。我的输出就是一个例子:

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

我明白了 97 98 99 10 255

但我想要: 97 98 99 10

关于如何解决这个问题的任何想法?谢谢!

【问题讨论】:

  • 为什么是!cin.eof()?是来自文件的输入吗?

标签: c++ io cin


【解决方案1】:

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;
}

【讨论】:

  • 虽然你可能不应该使用EOF,因为该特征可能会在文件末尾返回另一个值而不是-1,对吧?
  • @AlexisWilke - 一般情况下,但不是专门针对cinstd::cin 将始终使用 std::char_traits&lt;char&gt;,后者使用 EOF
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2021-11-24
    • 2015-06-20
    • 2016-07-13
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 2022-09-24
    • 2021-12-03
    • 2021-11-22
    相关资源
    最近更新 更多