【问题标题】:C stdin reads file infinitelyC stdin 无限读取文件
【发布时间】:2012-09-06 18:55:07
【问题描述】:

我有一个需要从标准输入读取输入的基本 C 程序。 首先,它通过使用从输入文件中读取

./Program <input

然后它会循环读取,直到没有更多内容为止

while(scanf("%s",command)!=EOF){
    printf("%s\n",command);
}

之后我需要再次从键盘读取,但它会继续无限地垃圾邮件从我的输入文件中读取最后一行,而不是让我使用键盘进行输入。

 while(1){

 scanf("%s",command);
 if(!strcasecmp(command,"exit"))
  exitProg();
 else if(!strcasecmp(command,"help"))
  helpMess();
 else
  printf("Command \"%s\" not recognized, use command \"help\" for a list.\n",command);
 }

【问题讨论】:

  • 如果将标准输入重定向到一个文件,它将不再连接到终端。
  • 有没有办法将它引导回键盘?
  • 在某些平台上,是的(但是没有标准方法)。然而,我可能只是将初始文件作为参数并使用常规方法读取它(而不是重定向任何东西)。

标签: c stdin infinite


【解决方案1】:

阅读documentation for scanf,具体是关于返回值的部分,摘录如下:

返回值

成功时,函数返回成功读取的项目数。如果发生匹配失败,此计数可以匹配预期的读数数量或更少,甚至为零。 如果在成功读取任何数据之前输入失败,则返回 EOF。

您遇到的问题是,一旦文件用完数据,程序的标准输入不会恢复到控制终端,它会停留在空文件的末尾。您的 scanf 调用静默失败,未修改 command 的内容。如果您希望能够同时读取两者,则需要找到另一种处理方式。

您的 shell 可能支持此功能。

【讨论】:

  • @jons34yp:您的链接问题,按类别:1. 已更正(网站描述已更新) 2. 它们主观上相似 3a。不好的做法并不意味着不正确的 3b。仅引用一个博客。 STL == 标准模板库。这是一个真实的东西3c。除了 C++ 扩展之外,网站还记录了旧的 C stdlib。那些与 C++ 相关的使用 等 3d。不知道说什么 4a。是的,它确实。阅读 memcpy 和 memmove 4b 的页面。是的,请阅读 atoi 第 4c 页。我怀疑这种行为是特定于实现的。网站没有说明如何进行比较。
  • @jons34yp:如果你不应该引用一个网站,因为它并不完美,那么人们可能也不想引用 SO。我认为我认为 cplusplus.com 比没有更有用。
  • 在 linux 手册页中必须至少有一些错误陈述。按照你的逻辑,如果存在超过 4 个,我们也不应该使用它们。
猜你喜欢
  • 2012-08-28
  • 2020-05-08
  • 2010-12-17
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
相关资源
最近更新 更多