【发布时间】:2013-07-26 12:57:53
【问题描述】:
int main(int argc, char *argv[])
{
int c = EOF;
FILE *fp = fopen("./temp.txt", "r");
assert(fp!=NULL);
while (1) {
c = fgetc(fp);
if (EOF != c) {
putchar(c);
}
}
return 0;
}
temp.txt 是一个缓慢增加的日志文件,所以这个程序可以读取 EOF。在它第一次遇到 EOF 之后,我认为它应该停止获取 temp.txt 的新添加数据,而它就像 tail -f temp.txt 并继续打印文件的新行。
是的,我知道有一个无限循环。问题是我想, 当 fgetc 第一次遇到 EOF 时,它应该在结构 fp 中做一些记录, fgetc 的下一次调用应该检查这一点并立即返回 EOF。 为什么它继续读取磁盘上的数据,它没有到达文件末尾? 这是预期的行为吗?
【问题讨论】:
-
最好写:
while ((c = fgetc(fp)) != EFO){ putchar(c);} -
您显然是在将您的程序与 Glibc 链接起来。如果你将它与 uClibc 链接起来,它会在 EOF 之后第一次调用 fgetc 时崩溃。在未指定 EOF 之后从 FILE 中读取。
-
请注意,知道您在文件末尾的正确方法是使用手册页中描述的
feof函数。 -
许多实现都如您所愿。但是,并非所有人都这样做。
fgetc在为流返回EOF后的行为是未指定的。