利用fread读取二进制文件的bug
2024-09-07 22:15:31
最近在做一个项目时需要读取二进制文件,我用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的时候它就以为文件结束了,因此也就停止了读取,二进制模式则不会存在这个问题。
最新文章
- crontab不执行perl脚本分析
- 虚拟机上安装Linux操作系统
- Perl Sort函数用法总结和使用实例
- (转)数据库获得当前时间getdate()
- C++中this指针的用法详解(转)
- sql查询当天数据
- 配置vim之插件
- Android SQLite 数据库 增删改查操作
- git submodule相关操作
- JS中获取页面单选框radio和复选框checkbox中当前选中的值
- 读论文系列:Object Detection ECCV2016 SSD
- 2015 多校联赛 ——HDU5335(Walk out)
- iOS程序依赖管理的工具——CocoaPods
- Python爬虫示例
- 第四步 使用 adt-eclipse 打包 Cordova (3.0及其以上版本) + sencha touch 项目
- RabbitMQ入门_12_发布方确认
- Jenkins 基础入门
- 谈一谈PHP计划任务
- postman md5加密 然后传给下一个接口作为参数调用
- 从0x00到0xFF的含义以及二进制到10进制的转换(转)