为什么EOF在fgets和read中表现不同

时间:2016-02-21 13:14:42

标签: c linux fgets eof

#include <stdio.h>

#define MAXLINE 4096

int 
main(int argc, char **argv)
{
    char           *s;
    char            buf[MAXLINE];

    s = fgets(buf, MAXLINE, stdin);    // here, if replaced with read(0, buf, MAXLINE);        

    return 0;
}

输入:12 ctrl+d

  1. fgets在再次输入ctrl + d之前不会返回(即:ctrl+dctrl+d)。为什么在fgets包含第一个EOF时fgets不返回? 似乎12 ctrl+d不起作用。

  2. 但当s = fgets(buf, MAXLINE, stdin);替换为read(0, buf, MAXLINE); read时会返回(输入也是:12 ctrl+d)。

2 个答案:

答案 0 :(得分:3)

  

在终端上点击 CTRL + d

     
      
  • 只是意味着立即刷新stdin(输入缓冲区)中的所有字符
  •   
  • 它不会在fgetc()上触发EOF条件   (除非当前行/缓冲区偶然为空。)
  •   

在运行程序时点击CTRL + D

  • 如果连续两次执行,EOF会被取消。
      1st =刷新当前缓冲的字符,
     2nd =刷新空缓冲区;即fgetc()条件对fgetc()有效,并返回
  • 如果您在空行中执行一次,则会冻结stdin
     刷新已空的EOF缓冲区,即fgetc()条件对read()有效并返回。
  • 一旦输入被刷新,被阻止的{{1}}就会立即返回。

查看此 question 的答案以获取更多详情。

答案 1 :(得分:3)

在通常的实现中,fgets基于read的循环。如果您致电fgets,则会在内部拨打read。键入 1 2 Ctrl + D 使read返回两个字符&#34; 12&#34;到fgets。这还没有完整,所以fgets再次调用read。由于我们从终端设备读取而不是文件,例如read等待您输入更多数据。如果再次键入 Ctrl + D read将返回0个字符,fgets将其解释为文件结尾并返回。