为什么用EOF清空stdin

时间:2015-01-29 17:21:02

标签: c

关于刷新stdin有很多问题,我的不是关于如何刷新它,而是关于以下函数的含义:

while((c = getchar()) != '\n' && c != EOF);

我正在尝试考虑场景为什么以及如何在此函数中需要EOF来清空标准输入?用户键入内容并按Enter键,我们清空缓冲区直到找到输入,EOF在哪里进来?

谢谢

编辑: 非常感谢您的第一个答案和第二个评论,它回答了我的问题并完全满足了我。

除了我们从一个我们有真实EOF的文件中输入输入的场景之外,我几乎已经回答了我的问题,我仍然不明白为什么我们在任何其他场景中需要EOF来实现这样的功能。用户只能在终端的一行开头调用EOF,因此不能用于清空缓冲区。

3 个答案:

答案 0 :(得分:5)

如果用户插入Ctrl-D(在Linux / OS X上)或Ctrl-Z(在Windows上),则从stdin获取EOF。此外,标准输入可能会从文件中重定向 - 在这种情况下,最终您会得到一个真实的" EOF。

在这两种情况下,如果没有检查循环会永远持续下去,等待永远不会出现的换行符(在这里插入忧郁的音乐)。

答案 1 :(得分:4)

您的代码没有“刷新”stdin。它只是搜索最近的'\n'或输入的结尾,以先到者为准。

您可以在以下几种情况下获得EOF

  • 最终用户按下关闭stdin的组合,这意味着下一次阅读尝试将返回EOF
  • 当输入通过特定于操作系统的方式重定向以访问文件而不是使用控制台时,您点击了实际的文件结尾,例如: a.out <data.txt
  • 在访问程序的输入流时出现读取错误。

你可能会这样做的原因可能有所不同,但大多数情况下它会清除以前无效输入的剩余部分。

答案 2 :(得分:1)

您出现的语句从stdin读取当前行的剩余部分并将其丢弃,无论该行是以换行符结尾('\n')还是在流末尾({{1} }})。正如dasblinkenlight所观察到的那样,这不是通常所谓的“冲洗”。

EOF在流末尾或出错时返回getchar(),并EOF,因此如果没有EOF != '\n'检查,该语句会无限循环流的结束。

输入的最后一行绝不会是新行终止的。实际上,您可能会争辩说,流的最后一行是由流末尾终止的行,因此最后一行从不换行符终止,但它可能包含零个字符。