现在的位置: 首页 > 综合 > 正文

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

2014年12月05日 ⁄ 综合 ⁄ 共 767字 ⁄ 字号 评论关闭
首先附上 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之类的文件块操作的时候一定要自己判断是否是读写错误还是遇到结束符。

抱歉!评论已关闭.