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。 为什么它继续读取磁盘上的数据,它是否到达文件结尾? 这是预期的行为吗?
答案 0 :(得分:2)
快速回答是,没有break
退出while
循环。
当它显示EOF
时,它会循环回来并保持在c = fgetc(fp);
。
如果您需要它在点击EOF时停止阅读,您可以添加else
:
while (1) {
c = fgetc(fp);
if (EOF != c) {
putchar(c);
} else {
// reached the EOF
break;
}
}
答案 1 :(得分:1)
你没有告诉它在找到EOF时离开while循环,你只是说如果你确实发现EOF不对它做任何事情。你需要在循环中放置一个条件中断,或者有一个条件,直到while循环将继续。
答案 2 :(得分:0)
int main(int argc, char *argv[])
{
int c = EOF;
FILE *fp = fopen("./temp.txt", "r");
assert(fp!=NULL);
while (1) { // here
c = fgetc(fp);
if (EOF != c) {
putchar(c);
}
}
return 0;
}
这是因为你有一个无法停止的无限循环(除了一些信号)。这个程序将永远阅读temp.txt
。
答案 3 :(得分:0)
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);
}
else
break; //this will fix your problem of infinite loop even finding EOF
}
return 0;
}
答案 4 :(得分:0)
当你做
时,IMO会更好看int c = 0;
while ((c = fgetc(fp)) != EOF)
{
putchar(c);
}