【问题标题】:Cannot cin.ignore till EOF?在EOF之前不能cin.ignore?
【发布时间】:2015-04-22 09:08:22
【问题描述】:

我想忽略cin 中的所有字符以刷新此答案中的cinHow to get rid of bad input one word at a time instead of one line at a time?

但我发现,如果我写了,程序似乎挂起等待输入:

cin.ignore(std::numeric_limits<std::streamsize>::max());

如果我使用 '\n' 分隔符,它会正确刷新 cin

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

我的问题是,为什么我不能忽略直到 EOF?为什么我必须提供分隔符?

【问题讨论】:

  • 可以忽略直到EOF。您确实忽略了直到 EOF。你只是没有意识到这实际上意味着什么。 ;-)
  • 您是否通过从文件或其他有限源重定向,或者按 CTRL-D 或您平台上的任何其他方式使其到达 cin 的末尾?否则,它将等待输入永远被忽略。
  • 那么你的愿望是丢弃当前已经输入的所有字符,然后开始正常阅读?这是个好问题。
  • @MarkRansom 对。看来答案比我想象的要清楚,只是没看懂ignore

标签: c++ delimiter cin flush


【解决方案1】:

ignore 函数名称有点误导。它实际上做了什么读取丢弃输入,直到找到终止符。这是一个阻塞读取。

在您的情况下,无论您使用cin(默认为stdin)使用的任何输入流都不会提供文件结束条件,因此ignore 的读取/丢弃循环将永远阻塞。

【讨论】:

  • 除非涉及管道,否则写入端在关闭时会发出 EOF。另一个例外是支持 EOF 的终端中的用户输入(Linux:ctrl-D)
  • 在 Windows 上,您可以使用 Ctrl-Z+Enter 在控制台上标记 EOF,而在 *nix 上,您可以使用 Ctrl-D 来标记。所以爆发也不是不可能,只是如果你不知道诀窍的话就不太可能。
  • @Dieter, Mark:是的,我没有说输入流无法提供 EOF,只是在他的情况下它没有这样做。
猜你喜欢
  • 2017-10-21
  • 1970-01-01
  • 2016-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-08
相关资源
最近更新 更多