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时,它应该在struct fp中做一些记录, 下一次调用 fgetc 应该检查这一点并立即返回 EOF。 为什么它继续读取磁盘上的数据,没有到达文件末尾? 这是预期的行为吗?
最佳答案
快速回答是,没有退出 while
循环的 break
。
当读取到 EOF
时,它会循环回来并保持在 c = fgetc(fp);
上。
如果您需要它在到达 EOF 时停止读取,您可以添加一个 else
:
while (1) {
c = fgetc(fp);
if (EOF != c) {
putchar(c);
} else {
// reached the EOF
break;
}
}
关于c - 为什么这个程序的行为类似于 `tail -f`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17881920/