免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6334 | 回复: 3
打印 上一主题 下一主题

问个fread的未知问题 [复制链接]

论坛徽章:
0
1 [报告]
发表于 2010-07-02 10:59 |显示全部楼层
以返回的长度为准。如果不足是要再读的。至于这种情况是否发生,和平台以及fread()实现情况有关。你不能假设r只能是失败或者100。

论坛徽章:
0
2 [报告]
发表于 2010-07-02 11:59 |显示全部楼层
是的,还有判断r返回0的情况,要不就死循环了。

论坛徽章:
0
3 [报告]
发表于 2010-07-03 02:02 |显示全部楼层
我不知道LZ把我的回帖提前是什么意思,但LZ的循环体明显是有问题的。

  1. int len = 100;//文件实际长度,已知
  2. int r = 0;
  3. while ( len>0 )
  4. {
  5.     r = fread(buf,1,len,fp);
  6.     len-=r;
  7. }
复制代码
注意LZ没有判断返回值r==0的情况,这是程序员常见的问题,往往图方便不愿意写全容错代码。
我的改动意见如下:

  1.   total = 0;
  2.   while( !feof( stream )  && total<100 )
  3.    {
  4.       // Attempt to read in 100 bytes:
  5.       count = fread( buffer+total, sizeof( char ), 100, stream );
  6.       if( ferror( stream ) )      {
  7.          perror( "Read error" );
  8.          break;
  9.       }

  10.       // Total up actual bytes read
  11.       total += count;
  12.    }
复制代码

论坛徽章:
0
4 [报告]
发表于 2010-07-03 02:08 |显示全部楼层
本帖最后由 没本 于 2010-07-03 02:11 编辑

如果文件长度100不是已知的话,还要调整fread中的读长度参数为100-total,以免缓冲区溢出。如不如此的话,为缓冲区多分配100字节也是一个好办法。因为文件长度有可能因某种原因改变,例如中病毒。程序员不能假设系统里一切都是按自己设想的存在,因此健壮的程序里必须处理各种意外。不要害怕烦琐而写出有缺陷的程序,给黑客制造攻击机会。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP