前列腺钙化
前列腺钙化的我,如何拯救输卵管堵塞的你。

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

posted on 2018-02-24 09:36  龙城狂拽酷炫霸  阅读(189)  评论(0编辑  收藏  举报