背景

最近项目中弄个接口,涉及到二进制文件处理,刚开始对读写文件夹这块没有太注意,结果最后浪费了一些时间。

文件大小600+k(不到一兆),二进制存储,总长度638208个字节,如下:

正文

最初,通过fopen打开文件,如下:

/* 打开文件*/

if((fp_input = fopen(strFilePath.GetBuffer(), "r")) == NULL)

{

MessageBox("Can't open intput file!");

}

然后获取文件的总长度,如下:

/* 获取文件总长度(总字节数) */

long filesize(FILE *stream)

{

long curpos, length;

curpos = ftell(stream);

fseek(stream, 0L, SEEK_END);

length = ftell(stream);

fseek(stream, curpos, SEEK_SET);

return length;

}

一切看似都很正常,文件能打开,总长度获取也没问题,然后就是通过fread读取文件内容了,如下:

/* 读取文件内容 */

if(fread(str_file, 1, flength, fp_input) == 0)

{

MessageBox("Can't read file!");

return;

}

OK,下面就开始根据接口格式解析文件内容了。

问题也就出来了,明明文件总长度为638208个字节,但每次处理到629000+个字节后程序就崩掉了。开始我以为是我解析代码里面内存没处理好造成内存溢出了,然后我就把所有分配内存的地方注释掉,发现还有问题。调了一段时间后,我就在函数入口的地方直接偏到629000+的位置看了内存里面的内容,发现竟然为空。现在就定位了问题出在前面的读文件,往前看代码,发现fopen的时候用的“r”,改成“rb”,重新跑了下程序。OK了,OK了,OK了,为什么?

为什么用“r”和“rb”都能读取文件内容,但读出来的东西却不一样了?

带着疑问,在网上搜了一把(之前确实没注意过这个问题,也没遇到过),发现真有这样的问题,原因如下:

先看一段MSDN:

If the given stream is opened in text mode, carriage return–linefeed pairs are replaced with single linefeed characters. The replacement has no effect on the file pointer or the return value.

就是说如果按“文本模式”打开一个文件,那么在读入的时候,Windows默认的换行符CR+LF就会转换成一个单个的LF。

引自:https://blog.csdn.net/tgdzsjh/article/details/32702073

r遇到0x0d后面没有0x0a会自动加一个,遇到0x1a会忽略后面的内容

rb不会

r 读到\r\n会改为\n,读到\x1a会返回EOF

rb 读到什么返回什么,读到文件末尾才会返回EOF

引自:https://blog.csdn.net/cattylll/article/details/7107089

java实现fread_fread函数读取到的数据和实际数据不一样相关推荐

  1. pandas使用read_csv函数读取文件的前N行数据并保留表头、pandas使用read_csv函数读取制表符分割的文件(tab-delimited)、自定义设置sep参数

    pandas使用read_csv函数读取文件的前N行数据并保留表头.pandas使用read_csv函数读取制表符分割的文件(tab-delimited).自定义设置sep参数 目录

  2. java. int 高低位读取写,数字高位和低位,数据高低位

    内容导航: Q1:计算机知识,什么是高位和低位? 字是两个字节,也就是16个零或一组成的,例如0000 0000 0000 0000,这十六个位置中前八个就是高位,后八个是低位.内存是按字节存放的,而 ...

  3. java实现简单的读取excel中的每一行数据

    参考: https://www.cnblogs.com/cbzg/p/5747739.html 需要的jar包 网盘下载链接 提取码:qw23 读取excle文件代码 public class Rea ...

  4. java stream 多次读取_多次从具有大量数据的Java InputStream中读取

    我想知道什么是从Java InputStream多次读取字节并在流很大时仍然有效的最佳方法. 假设我有以下代码: public void handleBytes(InputStream in) { d ...

  5. 【EasyExcel】Java读取一维及二维Excel数据并存入数组

    EasyExcel是一个基于Java的.快速.简洁.解决大文件内存溢出的Excel处理工具.它能让你在不用考虑性能.内存的等因素的情况下,快速完成Excel的读.写等功能. Java基于EasyExc ...

  6. java解析tfrecord_TensorFlow高效读取数据的方法——TFRecord的学习

    摘要: ortmatplotlib.pyplotaspltimportcv2defshow_image(title,image):'''显示图片:paramtitle:图像标题:paramimage: ...

  7. pandas使用read_csv函数读取文件并解析日期数据列(parse dates)、pandas使用read_csv函数读取文件并将缺失值转化为空字符串

    pandas使用read_csv函数读取文件并解析日期数据列(parse dates).pandas使用read_csv函数读取文件并将缺失值转化为空字符串 目录

  8. pandas使用read_csv函数读取文件时指定数据列的数据类型、pandas使用read_csv函数读取文件时通过keep_default_na参数设置缺失值替换为空字符串

    pandas使用read_csv函数读取文件时指定数据列的数据类型.pandas使用read_csv函数读取文件时通过keep_default_na参数设置缺失值替换为空字符串 目录

  9. pandas使用read_csv函数读取文件最后N行数据并保留表头、pandas使用read_csv函数读取网络url链接数据

    pandas使用read_csv函数读取文件最后N行数据并保留表头.pandas使用read_csv函数读取网络url链接数据 目录

最新文章

  1. CCF201803-1 跳一跳(序列处理)
  2. 请求中文乱码_【1】执行Http请求访问网页
  3. centos6 mysql 导出sql_centos环境下如何导出数据库
  4. python装饰器怎么编程_Python编程:Python装饰器入门
  5. 2015 Google code jam Qualification Round A 水
  6. RedHat 6.4下安装Openoffice软件
  7. 访问网络共享时出现“拒绝访问”
  8. linux的mount和umount指令使用
  9. 算法与数据结构(六):堆排序
  10. 博弈树α-β剪枝搜索学习参考资料
  11. mysql客户端攻击_HackerNews
  12. 怎么分辨是不是外包工司_怎么分辨白酒是不是纯粮食酒?学会这几招,轻松辨别真假白酒...
  13. 加密解密技术基础、PKI及创建私有CA
  14. 上班族的真实生活写照-上班、加班、免费加班
  15. Mac OS 下安装wget
  16. 谭浩强c语言程序60题,谭浩强版C语言课后经典习题解答100例
  17. HTML实现直播礼物特效,抖音哪些礼物可以触发特效,抖音直播礼物特效大全
  18. [Slackware13.0学习笔记]上网问题
  19. Visio2019异步消息箭头线使用问题
  20. od反汇编linux,新手学习反汇编之OD寻找功能call

热门文章

  1. TensorFlow损失函数
  2. 怎么查找执行比较慢的sql语句
  3. centos7 下搭建git服务器
  4. CentOs下卸载程序
  5. Cocos生命周期回调
  6. python xlrd 的merged_cells 里面四个参数的含义
  7. Android Shape 的使用
  8. 御水.20180506
  9. Linux 忘记root登录密码解决方法
  10. 2022-2028年中国医养结合模式深度调研及投资前景预测报告