博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
fread的第二个参数和第三个参数可以互换吗---为什么fread容易返回0 ?
阅读量:4140 次
发布时间:2019-05-25

本文共 1627 字,大约阅读时间需要 5 分钟。

 

       我们先来看看fread函数的原型:size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;

 

参 数

buffer 内存地址
size 要读取的字节数, 单位是字节
count 要读取多少个size
stream是文件流
返回值
实际读取的元素个数.如果返回值与count不相同,则可能文件结尾或发生错误. 从ferror和feof获取错误信息或检测是否到达文件结尾.
 

      我们会很容易理解为size * count = count * size, 但是当文件的长度不能被size(比如10000)整除时, 那就有问题了, 事实经常如此, 先上菜:

 

#include 
using namespace std;int main(){ FILE *fp = fopen("haha", "rb"); fseek( fp, 0, SEEK_END ); int fileSize = ftell(fp); fclose(fp); cout << fileSize << endl << endl; int x = 0; fp = fopen("haha", "rb"); char buf[10000] = {0}; int totalSize = 0; while(1) { x = fread(buf, sizeof(buf), 1, fp); cout << x << endl; totalSize += x * sizeof(buf) ; if(x <= 0) { break; } } fclose(fp); cout << endl << totalSize << endl << endl; if(fileSize != totalSize) { printf("error\n"); //进入了此分支 } else { printf("ok\n"); } return 0;}

     结果为:

 

49750

1
1
1
1
0
40000
error

 

 

 

       继续上菜:

 

#include 
using namespace std;int main(){ FILE *fp = fopen("haha", "rb"); fseek( fp, 0, SEEK_END ); int fileSize = ftell(fp); fclose(fp); cout << fileSize << endl << endl; int x = 0; fp = fopen("haha", "rb"); char buf[10000] = {0}; int totalSize = 0; while(1) { x = fread(buf, 1, sizeof(buf), fp); cout << x << endl; totalSize += x; if(x <= 0) { break; } } fclose(fp); cout << endl << totalSize << endl << endl; if(fileSize != totalSize) { printf("error\n"); } else { printf("ok\n"); // 进入了此分支 } return 0;}

      结果为:

 

49750

10000
10000
10000
10000
9750
0
49750
ok

       原来, 看到没, fread返回的是读取的count数目, 当文件末尾不足时, 千万要注意。 同理, 各位有空的话, 可以研究一下fwrite, 我就不赘述了。 现在明白了为什么第二个参数和第三个参数不能互换, fread经常返回0的问题了吧! 祝贺你,Oh, come on.

 

 

转载地址:http://corvi.baihongyu.com/

你可能感兴趣的文章
苏宁产品经理面经
查看>>
百度产品经理群面
查看>>
去哪儿一面+平安科技二面+hr面+贝贝一面+二面产品面经
查看>>
element ui 弹窗在IE11中关闭时闪现问题修复
查看>>
vue 遍历对象并动态绑定在下拉列表中
查看>>
Vue动态生成el-checkbox点击无法选中的解决方法
查看>>
MySQL Tricks1
查看>>
python 变量作用域问题(经典坑)
查看>>
pytorch
查看>>
pytorch(三)
查看>>
ubuntu相关
查看>>
C++ 调用json
查看>>
nano中设置脚本开机自启动
查看>>
动态库调动态库
查看>>
Kubernetes集群搭建之CNI-Flanneld部署篇
查看>>
k8s web终端连接工具
查看>>
手绘VS码绘(一):静态图绘制(码绘使用P5.js)
查看>>
手绘VS码绘(二):动态图绘制(码绘使用Processing)
查看>>
基于P5.js的“绘画系统”
查看>>
《达芬奇的人生密码》观后感
查看>>