处理stdin流和EOF时如何使用fgets和feof?

问题描述

下面是我的课本中的一段代码:

#define MAXLINE  8192 

int main()
{   
    char cmdline[MAXLINE]; 

    fgets(cmdline,MAXLINE,stdin);
   
    if (feof(stdin))
    {
       exit(0);
    }

    printf("the string is %s",cmdline);

    exit(0);   
}

fgets的定义是

从指定的流中读取一行并将其存储到str指向的字符串中。当读取(n-1)个字符,读取换行符或达到文件结尾(以先到者为准)时,它将停止。

我的问题是:

Q1-如果我在shell中运行该程序并开始键入,如何将EOF指示为stdin?我已经尝试过Ctrl + D,但是在按Enter键之前我仍然可以继续输入,所以Enter更像是EOFstdin

问题2-为什么需要使用feof测试EOF的{​​{1}}指标?我们可以摆脱stdin的输出是相同的。

解决方法

Q1-如果我在shell中运行该程序并开始键入,如何将EOF指示为stdin?我已经尝试过Ctrl + D,但是在按Enter键之前我仍然可以继续输入,所以Enter更像是EOF到stdin?

Why do I need to type Ctrl-D twice to mark end-of-file?

问题2-为什么需要使用feof测试EOF的{​​{1}}指标?我们可以摆脱stdin的输出是相同的。

输出是相同的,因为尚未使用立即结束的文件对代码进行测试。

if (feof(stdin)) exit(0);返回fgets()时,是由于文件结尾或罕见的输入错误。

测试NULL是测试feof(stdin)中是否包含有效数据的不良方法。它简单地报告检测到文件结束。如果为true,则cmdline中可能包含有效数据,也可能没有有效数据。如果为false,则cmdline具有有效的数据(如果不仅仅是发生输入错误)。当错误和刚刚发生输入错误时,cmdline不确定

在任何情况下,这都不足够。最好测试cmdline[]的返回值。

fgets()

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...