为什么这个程序的行为类似于`tail -f`

时间:2013-07-26 12:57:54

标签: c file eof fgetc

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。 为什么它继续读取磁盘上的数据,它是否到达文件结尾? 这是预期的行为吗?

5 个答案:

答案 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)

当你做

时,I​​MO会更好看
int c = 0;
while ((c = fgetc(fp)) != EOF)
{
    putchar(c);
}