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

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

最佳答案

快速回答是,没有退出 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/

相关文章:

c++ - 如何将 C++ vector 导出到 excel?

file - dev-C++ 中的头文件

C++ 从文件末尾向后读取文件

c - 如何只输入一个EOF结束scanf

c - 通过默认网关地址的硬件地址而不是以太网多播地址发送多播

c - 这个模块有过时的符号

c - 皇后拼图 4x4

c - 如何从输入读取两行数到2个数组,C语言?不知道数量?在C中

c - 如何继续使用 malloc?

c - 为什么 EOF(文件结尾)在行尾没有 '\n' 之前不起作用?