2012-09-06 84 views
0

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

./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); 
} 
+0

如果将标准输入重定向到文件,则不再连接到终端。 –

+0

有没有办法直接回到键盘? – kingdamian42

+4

在某些平台上,是(没有标准方法,但是)。然而,我也许只是把最初的文件作为参数,然后用传统的方法读取它(而不是重定向任何东西)。 –

回答

0

阅读documentation for scanf,特别是对返回值,摘录如下部分:

返回值

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

您遇到的问题是一旦文件用完数据,程序的标准输入不会恢复到控制终端,它将停留在空文件的末尾。您的scanf呼叫默默无效,因此不会修改command的内容。如果你想能够从两者中读取,你需要找到另一种处理方式。

您的shell可能支持此功能。

+1

[不要使用cplusplus.com](http://jcatki.no-ip.org/fncpp/cplusplus.com) – 2012-09-06 19:15:29

+0

@ jons34yp:问题与您的链接,按类别:1.更正(网站的描述已更新)2.他们在主观上相似3a。不好的做法并不意味着不正确的3b。仅引用了博客。 STL ==标准模板库。这是一件真实的事情3c。除C++扩展外,网站还提供旧的C stdlib文件。那些与C++相关的使用等3d。不知道说些什么4a。是的,它确实。读取memcpy和memmove 4b的页面。是的,阅读atoi页面4c。我怀疑这种行为是特定于实现的。网站并未指定如何执行比较。 – Wug

+0

@ jons34yp:如果你不应该指向一个网站,因为它不完美,那么你可能不想引用SO。我认为我会认为cplusplus.com比没有更有用。 –