fgets正在从已关闭的文件描述符中读取更多数据

sun*_*nil 2 c linux file-io fgets eof

我在linux上遇到了fgets()的一些问题.fgets从关闭的文件描述符返回数据.如果文件关闭,我希望它返回EOF.我能够提出我的问题的简化版本.

int main()
{
        int i=0, j;
        FILE *FD;
        char p[128];
        FD = fopen("junk", "r");
        while(fgets(p, sizeof(p), FD))
        {  
                close(fileno(FD));
                printf("lineno=%d\n", i++);
        }  
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望它只打印一行.这个问题有解决方法吗?

更新:正如有人在下面回答的那样,fgets正在缓冲文件并在FD关闭后返回数据.它正在缓冲4kB的数据.如果文件大小超过4k,则在读取4KB后获得EOF并且打印停止.否则如果文件大小感谢4k,它会打印到文件末尾.

Bra*_*lor 5

在已关闭的文件上调用fgets()具有未定义的行为.换句话说,不保证返回EOF.