【发布时间】:2016-06-02 20:56:36
【问题描述】:
#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;
}
输入是:12ctrl+d
fgets直到再次输入ctrl+d才返回(即:12ctrl+dctrl+d)。为什么 fgets 在遇到第一个EOF时不返回? 似乎 12ctrl+d不起作用。但是当
s = fgets(buf, MAXLINE, stdin);被read(0, buf, MAXLINE);替换时read会返回(输入也是:12ctrl+d)。
【问题讨论】:
-
因为它们是不同的功能?为什么您希望它们表现相同?
-
我认为 fgets 在按照手册遇到 EOF 时应该返回,但输入 12
ctrl+dfgets 不会返回。 fgets() 从流中最多读入一个小于 size 的字符并将它们存储到 s 指向的缓冲区中。在EOF或换行符后停止阅读。 -
该标准没有指定何时检测到 eof。尝试从 shell 中的文件重定向
stdin,您将看到不同的行为。 Itr 是控制台缓冲的问题。 -
根据手册,fgets()从流中最多读入一个小于size的字符,并将它们存储到s指向的缓冲区中。 在 EOF 或换行符后停止读取。