最近在做一个项目时需要读取二进制文件,我用C语言的fread进行读取,代码如下:

FILE *fp;
int read_data;
fopen_s(&fp, file_path, "r");
if (fp)
{
fseek(fp, 0L, SEEK_END);
size = ftell(fp);
fclose(fp);
data = new char[size];
fopen_s(&fp, file_path, "r");
read_data = fread(data, size, 1, fp); fclose(fp);
}

fread这部分代码的意思是要读一个size大小的内容输出到data上,返回的read_data代表有多少个size大小的数据块被成功读取了。执行这部分代码,然后神奇的事情发生了,read_data的值为0,并且data+small_size (small_size比size要小)的值是“屯屯屯屯”,那就说明fread并没有将这个文件的内容读完整,而是读到一半就停止了。

查了一下stack overflow,我发现是因为我在打开文件的时候模式设成了"r",也就是程序是把它当做一个文本文件进行读取的。读取二进制文件的话应当将打开模式设为"rb"。

那么为什么用文本文件方式fread会暂停呢?我研究了一下,数组data中最后一个读到的字符是26号ascii码,也就是文件停止符号z。那就很明显了,当fread用文本模式读取时,读取到z的时候它就以为文件结束了,因此也就停止了读取,二进制模式则不会存在这个问题。

最新文章

  1. crontab不执行perl脚本分析
  2. 虚拟机上安装Linux操作系统
  3. Perl Sort函数用法总结和使用实例
  4. (转)数据库获得当前时间getdate()
  5. C++中this指针的用法详解(转)
  6. sql查询当天数据
  7. 配置vim之插件
  8. Android SQLite 数据库 增删改查操作
  9. git submodule相关操作
  10. JS中获取页面单选框radio和复选框checkbox中当前选中的值
  11. 读论文系列:Object Detection ECCV2016 SSD
  12. 2015 多校联赛 ——HDU5335(Walk out)
  13. iOS程序依赖管理的工具——CocoaPods
  14. Python爬虫示例
  15. 第四步 使用 adt-eclipse 打包 Cordova (3.0及其以上版本) + sencha touch 项目
  16. RabbitMQ入门_12_发布方确认
  17. Jenkins 基础入门
  18. 谈一谈PHP计划任务
  19. postman md5加密 然后传给下一个接口作为参数调用
  20. 从0x00到0xFF的含义以及二进制到10进制的转换(转)

热门文章

  1. wpf treeview 绑定图标方式
  2. ssh 免密访问
  3. ReactJS单页面应用之项目搭建
  4. 镜像问题、简易安装,系统语言更改,中文输入,提高下载速度,Firefox的语言更改,Firefox上网速度慢
  5. 使用laydate时间输入控件
  6. 从create-react-app 学点东西1:web-vitals
  7. windows上Yii2使用workerman整套流程
  8. ssl 导入和配置
  9. 使用HttpClient4.5 使用MultipartEntityBuilder 类发送 multipart/formdata 格式给第三方接口 失败的原因
  10. 浅谈tcp 与udp