C语言:当从文件重定向输入时,如何知道何时没有来自stdin的输入

时间:2018-06-07 04:15:36

标签: c gcc c11

我的程序应该按以下方式运行:

CProgram< file.txt的

file.txt可以包含任意数量的数据行。例如,

2 3 G 5 6
5 6 7 
6 9 3 6 H
<<Blank line>>

有没有办法知道没有更多的输入行?每个文件末尾都有一个空行。

我能够读取行,但我的程序永远不会知道是否没有更多的数据需要读取,并且一直在等待更多数据,正如它通常期望的那样。

这就是我读它的方式

 while( fgets(line, sizeof(line), stdin) != NULL) {
   ... do something
}

3 个答案:

答案 0 :(得分:5)

文件完成后,所有输入功能都会显示文件结束指示。例如:

#include <stdio.h>

int main(void) {
    int count = 0;
    while (getchar() != EOF)
        ++count;
    printf("There were %d characters.\n", count);
    return 0;
}

将计算输入流中的字符:

pax> ./testprog <testprog.c
There were 169 characters.

pax> echo -n hello | ./testprog
There were 5 characters.

如果你正在使用fgets(从你的更新中可以清楚地看到),那么也可以轻松检测:

#include <stdio.h>

static char buff[1000];

int main(void) {
    int count = 0;
    while (fgets(buff, sizeof(buff), stdin) != NULL)
        ++count;
    printf("There were %d lines.\n", count);
    return 0;
}

运行它将计算行数:

pax> ./testprog <testprog.c
There were 12 lines.

您可以在两个情况下看到使用输入重定向或管道方法正确检测到文件末尾。如果您正在从终端运行代码读取,则只需使用环境提供的工具指示文件结尾。

在UNIX类操作系统的行开头通常是 CTRL-D ,或者在Windows行的开头是 CTRL-Z

pax> ./testprog
this has
two lines
<Ctrl-D pressed (I run Linux)>
There were 2 lines.

答案 1 :(得分:3)

EOF代表文件的结尾,因此您可以阅读文件,直到您点击EOF

int c = 0;
while ((c = getchar ()) != EOF) { ... }

编辑:

while ( fgets(line, sizeof(line), stdin) != NULL ) {
    ... do something
}

应该正常工作,因为fgets()如果它到达文件末尾则返回NULL。至少在像OS(Unix / Linux / BSD / Mac OS)这样的Unix中,一切都是文件,标准输入也是如此。因此,您可以在标准输入上检查EOF

答案 2 :(得分:1)

由于您正在阅读stdin并使用fgets(),要终止循环或没有更多行要从用户处获取,请检查fgets()的返回值,如下所示。< / p>

char *ptr = NULL;
while( (ptr= fgets(line, sizeof(line), stdin)) != NULL) {
    if( *ptr == '\n')
        break;
    else { /* do something */  }
}

最后按ENTER键时,if条件为真,终止。