《unix环境高级编程》学习之 --- fread 函数

首先附上 fread 函数的声明:
  1. #include <stdio.h>
  2. size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
参数解释:
    ptr: 指向一块存储空间,用来存放本次读取到的数据
    size: 一个数据元素的大小
    nmemb: 本次读取多少个数据元素(也可以叫一个数据单元,我不知是否准确)
    stream: 将要读取的文件流
返回值:
    如果读取成功,返回 nmemb,即返回读取到的元素个数(不是读取的字符个数)
    如果遇到文件结束,返回实际读取到的元素个数,可能小于 nmemb
    如果失败,返回0
注意事项:
    在fread的文档中说了,对于返回值为0的情况,fread不区分到底是读到文件结束了,还是读取失败了。
看看如下代码存在的问题,假设fp为一个已经打开的可读文件流
  1. char buf[32] = {0};
  2. while(fread(buf, 32, 1, fp) > 0) {
  3.     printf("%s", buf);
  4. }
上面的代码存在一个问题就是,如果文件长度不是32的整数倍,始终不能输出整个文件!! 其原因就是最后一次读的时候,没有读够一个数据元素(即不够32字节),那么本次返回0,自然不会输出了。
于是想通过下面的修改
  1. while(fread(buf, 32, 1, fp) >= 0) {
  2.     printf("%s", buf);
  3. }
结果导致了无限循环。道理应该大家都明白。
归根结底就是在使用 fread 的时候没有区分错误或者文件结束。所以最终修改如下:
  1. while(fread(buf,32,1,fp) >= 0) {
  2.     printf("%s", buf);
  3.     if(feof(fp) break;
  4. }

总结:在使用 fread之类的文件块操作的时候一定要自己判断是否是读写错误还是遇到结束符。
<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
阅读(2564) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~
评论热议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值