feof
#include <stdio.h>
void clearerr(FILE *stream);
int feof(FILE *stream);
int ferror(FILE *stream);
int fileno(FILE *stream);
feof是用来判断文件是否到达文件尾的一个函数,当读到一个文件的末尾时返回非零值,若没有到末尾则返回0。
开始觉得挺好理解的,就是用来判断是否到达文件末尾而已,但是到大一期末课设用的时候才发现问题,而且很多人都有同样的问题,当时也想不出所以然,以为是使用块读写惹的祸,于是改用格式化文件输入输出,不知怎么地也就解决了,但是现在要使用块读写时又复现这个问题了,最后才知道原来feof并非。。。
首先,百度百科中有这样一句话来解释位置和内容:“你走到火车的最后一节车箱”这就是位置,而“请你一直向后走,摸到铁轨结束”这就是内容。也就是说用内容来判断会“多走一节”。这就是完全依赖于“while(!feof(FP)){…}”进行文件复制时,目标文档总会比源文档“多出一些”的原因。
说白了就是:当你的文件指针已经读取到最后了,但是feof还是会返回没有到文件的末尾,你再去读一次,读到了一次空的数据,这时用feof判断才会真正的返回非0值,表示文件到达文件尾了。
为了解决这个问题,当我们读取一个块时我们可以这样去写:
while(fread(void *ptr, sze_t size, size_t nmemb, FILE *stream) != 0 && !feof(fp))
{}
意思就是让它先去读一块,然后判断是否到达文件末尾,如果到达文件末尾,那么刚才读出的那一块内存也是空的,直接丢弃就好了。