fread函数返回值

fread函数原型:

size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;

size和count的含义:每次读count个块,每块为size字节

fread的返回值含义为:读到的块数,假定现在返回值为num(size太具有歧义,会让人以为是读到的字节数)

num值的判断:

1.num == count,读操作成功,返回count*size个字节;

2.num == 0,此时fread并不一定是读错了或到文件末尾了,fread函数返回值并没有判断这两种情况,以上两种情况只能用函数ferror和feof判断(返回值非零为正常)。

   当num为0时,也有可能只是读到的块数为0,前面说了不一定是文件末尾,那为什么会返回0呢?

    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下的解决方法,一定要告诉我[含泪期待脸]

 

 

 

 

 

转载于:https://my.oschina.net/u/2404244/blog/715461

  • 8
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值