一个C文件IO问题

一个C文件IO问题

作为练习,我写了下面一个用FILE stream来做读写的C程序:

然后编译:

运行:

发现最后一行总是出现两次。怎么回事呢? 查了一下feof的手册才知道,当已经读到文件最后一行时,feof并不会马上返回一个非0值,或者说设置EOF标志,而是在下次调用feof时才设置EOF标志,然后再下次调用feof时才返回非零值,所以while循环总是会多跑一遍。 那么,在这个循环多跑的一遍中,buf字节数组中为什么还是最后一行的内容,而非空呢? 查了一下fgets的返回规则,原来当fgets碰到EOF时,它返回NULL指针,但是buf中的内容保持不变,也就是还保留着最后一次fgets的内容,也就是我们这个例子中的最后一行。这样我们就可以以fgets的返回值来判断是否结束循环。 更改后的程序如下:

另外要注意,用feof时,读文件出错也会异常结束,未必一定是文件读完了。

Read More