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);

参考资料:

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

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

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

文件结束

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

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

原文地址:https://www.cnblogs.com/Browneyes/p/8464138.html