fread函数原型:linux
size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;windows
size和count的含义:每次读count个块,每块为size字节函数
fread的返回值含义为:读到的块数,假定如今返回值为num(size太具备歧义,会让人觉得是读到的字节数)rem
num值的判断:原型
1.num == count,读操做成功,返回count*size个字节;效率
2.num == 0,此时fread并不必定是读错了或到文件末尾了,fread函数返回值并无判断这两种状况,以上两种状况只能用函数ferror和feof判断(返回值非零为正常)。stream
当num为0时,也有可能只是读到的块数为0,前面说了不必定是文件末尾,那为何会返回0呢?file
num = fread ( buf, 1024, 1, fp),看一下这个例子,假如你的文件大小不足1024字节,或是循环读文件,最后一次循环剩余的字节小于1024字节,这个时候fread就会返回0值,而且buf中没有数据,这就致使文件根本没有读过去或是没读够。循环
解决这个问题的方法:方法
1.最简单,也就粗暴的方法,就是将size置为1, fread ( buf, 1, 1024, fp),一次读1字节,怎么样都不会错,这个方法的缺点就在于效率低下,并非fread函数使用的初衷,以块读写是为了提升效率的,因此这种方法只能用于没有办法的时候。
2.在读文件以前,先使用stat函数,获取文件的大小,这样读取到末尾的时候直接写具体的大小就行了,大体以下:
filesize = stat(file,...);
n = filesize/size;
remain = filesize%size;
while(n){ fread(..,size,........); n--; }
fread(..,remain,............);
此方法的缺点就是stat函数是linux系统函数,windows系统下没法使用,暂时也没找到替代函数.......(linux系统还能够直接用read函数.....windows简直.............第一种方法就是在没找到更好的方法以前,在windows下用的,没有办法的办法)
PS:若是大神们能看见个人拙见,有更好的在windows下的解决方法,必定要告诉我[含泪期待脸]