正确: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() 函数(文本文件和二进制都管用)