F2FS readblock PNG图片文件头不正确问题

正确:89 50 4E 47 0D 0A 1A 0A

错误:89 50 4E 47 0A 0A 1A 0A

需要用c++ 代码读取一帧图像的内容,图像大小为1368*768*4 = 4202496

代码如下:

char* buf = new char[4202496];  
ifstream fs("1.data");        
fs.read(buf,4202496);  
cout << fs.gcount() << endl;  

 

每次输出的gcount 都是217 ,无法读出指定数量的字节。

找了半天原因,发现在218字节位置文件二进制内容是0x1A,而0x1A 在ascii 码中代表EOF,所以文件读取到这个位置结束

这才发现原来是文件默认是以ascii 码的方式打开的,以二进制打开则解决问题。

ifstream fs("1.data",std::ifstream::binary);  
fd = _open(c->device_name, O_RDWR| O_BINARY);

 

参考资料:

文本文件和二进制文件区别:

文本文件读写;读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

二进制文件读写: 不对文件做任何处理,读到\x1a 当作一个普通的字节,继续读取

文件结束

EOF:EOF只是代表一个整形常量-1。因此很多人认为在文件的末尾存在这个结束标志EOF,这种观点是错误的。事实上在文件的末尾是不存在这个标志的。

读取文件过程中读到文件末尾,或者触发某种异常读取失败都会返回EOF,真正的判断文件结束应该用feof() 函数(文本文件和二进制都管用)

转载于:https://www.cnblogs.com/Browneyes/p/8464138.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值