#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
fgets
在再次输入ctrl + d之前不会返回(即:ctrl+dctrl+d
)。为什么在fgets包含第一个EOF
时fgets不返回?
似乎12 ctrl+d
不起作用。
但当s = fgets(buf, MAXLINE, stdin);
替换为read(0, buf, MAXLINE);
read
时会返回(输入也是:12 ctrl+d
)。
答案 0 :(得分:3)
在终端上点击 CTRL + d :
- 只是意味着立即刷新
stdin
(输入缓冲区)中的所有字符- 它不会在
fgetc()
上触发EOF条件 (除非当前行/缓冲区偶然为空。)
在运行程序时点击CTRL + D ,
EOF
会被取消。 fgetc()
条件对fgetc()
有效,并返回。stdin
。 EOF
缓冲区,即fgetc()
条件对read()
有效并返回。 查看此 question 的答案以获取更多详情。
答案 1 :(得分:3)
在通常的实现中,fgets
基于read
的循环。如果您致电fgets
,则会在内部拨打read
。键入 1 2 Ctrl + D 使read
返回两个字符&#34; 12&#34;到fgets
。这还没有完整,所以fgets
再次调用read
。由于我们从终端设备读取而不是文件,例如read
等待您输入更多数据。如果再次键入 Ctrl + D ,read
将返回0个字符,fgets
将其解释为文件结尾并返回。