利用fread读取二进制文件的bug
最近在做一个项目时需要读取二进制文件,我用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的时候它就以为文件结束了,因此也就停止了读取,二进制模式则不会存在这个问题。
利用fread读取二进制文件的bug的更多相关文章
- fread读取文件(二进制文件)
fread()是c库函数,利于移植,使用缓存,效率较read()高. 原型: size_t fread(void *buffer, size_t size, size_t count, FILE * ...
- 利用PHP取二进制文件头判断文件类型
<?php $files = array('D:\no.jpg', 'D:\no.png','D:\no2.JPEG','D:\no.BMP'); $fileTypes = array( 779 ...
- 用 C# 读取二进制文件
当想到所有文件都转换为 XML时,确实是一件好事.但是,这并非事实.仍旧还有大量的文件格式不是XML,甚至也不是ASCII.二进制文件仍然在网络中传播,储存在磁盘上,在应用程序之间传递.相比之下,在处 ...
- 信息管理代码分析<二>读取二进制文件数据
first和end做为全局变量,分别指向链表的头和尾.建立链表的方式也比较简易,从二进制文件数据块中,依次从头到尾读取,每读取一个就建立一个结点. /*基本模型*/ EMP *emp1; while( ...
- ASP.NET MVC + EF 利用存储过程读取大数据,1亿数据测试很OK
看到本文的标题,相信你会忍不住进来看看! 没错,本文要讲的就是这个重量级的东西,这个不仅仅支持单表查询,更能支持连接查询, 加入一个表10W数据,另一个表也是10万数据,当你用linq建立一个连接查询 ...
- ASP.NET MVC + EF 利用存储过程读取大数据
ASP.NET MVC + EF 利用存储过程读取大数据,1亿数据测试很OK 看到本文的标题,相信你会忍不住进来看看! 没错,本文要讲的就是这个重量级的东西,这个不仅仅支持单表查询,更能支持连接查询, ...
- 利用PHPExcel读取Excel的数据和导出数据到Excel
PHPExcel是一个PHP类库,用来帮助我们简单.高效实现从Excel读取Excel的数据和导出数据到Excel.也是我们日常开发中,经常会遇到的使用场景.比如有个客户信息表,要批量导出发给同事,我 ...
- .net上传文件,利用npoi读取文件信息到datatable里
整理代码,.net上传文件,利用npoi读取文件到datatable里,使用了FileUpload控件,代码如下: protected void Button1_Click(object sender ...
- 利用Python读取外部数据文件
不论是数据分析,数据可视化,还是数据挖掘,一切的一切全都是以数据作为最基础的元素.利用Python进行数据分析,同样最重要的一步就是如何将数据导入到Python中,然后才可以实现后面的数据分析.数 ...
- Ubuntu10.04中利用V4L2读取摄像头数据并保存成文件【转】
转自:http://blog.chinaunix.net/uid-29339876-id-4042245.html 利用V4L2读取UVC摄像头数据并保存成视频文件,主要参考http://linuxt ...
随机推荐
- 100多个常用 API 接口整理大全
聚合数据提供30大类,160种以上基础数据API服务,国内最大的基础数据API服务,下面就罗列一些免费的各类API接口. 手机号码归属地API接口: https://www.juhe.cn/docs/ ...
- Vulnhub 靶场 HMS?: 1
Vulnhub 靶场 HMS?: 1 前期准备: 靶机地址:https://www.vulnhub.com/entry/hms-1,728/ 攻击机ip:192.168.147.190 靶机ip:19 ...
- R6-1 输入年份和天数,输出对应的年、月、日
R6-1 输入年份和天数,输出对应的年.月.日 分数 15 全屏浏览题目 切换布局 作者 张泳 单位 浙大城市学院 要求定义和调用函数month_day ( year, yeardy, *****pm ...
- http头部meta 作用
<meta charset="utf-8"> <!-- 设置文档字符编码 --> <meta http-equiv="x-ua-compat ...
- maven 简易入门笔记
教程:http://www.yiibai.com/maven/ http://maven.apache.org/ 第一步:下载安装maven. 配置环境变量. 第二步: 设置mirror 中央存储仓 ...
- pdf在线预览 ng2-pdf-viewer的运用
angular项目在线预览PDF 1 安装 ng2-pdf-viewer yarn add ng2-pdf-viewer 2 在项目中添加 import { NgModule } from '@ang ...
- Java 8 stream 做大于几的统计
Map<String, Integer> marketplaceIdCountMap = amazonTemplateService .getAmazonTemplateList(quer ...
- css - 预编译less下,解决深度选择器失效问题,完成css样式修改
#若深度选择器有效.使用此可修改样式 /deep/ .cube-btn{ //...自定义css样式 } #深度选择器失效,则: 1.重新定义deep深度选择器 @deep:~'>>> ...
- vue中key
使用key维护列表的状态 当列表的数据变化时,默认情况下,vue尽可能的服用已存在的DOM元素,从而提升渲染的性能.但这种默认的性能优化策略,会导致由状态的列表无法被正确更新. key的使用注意事项: ...
- lui - pager - 分页
pager - 分页 demo lui demo <template> <div class="app-container"> <h3>el-p ...