C++ 读取二进制文件


这几天在研究C++二进制文件的读取,对C++还不是很熟悉,所以一开始以为直接一行一行的读取出来,就会是我们所熟悉的文本格式了,结果打印出来全是乱码。因此找了很多人帮忙,也看了很多博客,最终终于了解了。在这里把学到的重要的东西分享一下。

////////////////////////////////////////////////////////////////////////////////////

//以下内容来自佳哥童鞋:

不只是C/C++标准库,使用其它库时也要注意区分“文本”和“二进制”模式。打开文件,读写文件都不能混着来。

读二进制流就很好理解了,就是一字节一字节的。

至于文本,C/C++标准库的“文本”就只支持ASCII字符集的。如果你发现你正在使用的标准库可以处理汉字什么的,那只是操作系统提供的假象,没有可移植性。所以如果文本文件中有非ASCII字符,就不要考虑用C/C++标准库做文本处理了。

一个ASCII字符虽然也是一个字节,但与二进制字节是没有“一对一”的对应关系的。例如在Windows系统上,“换行”被表示为‘\r’‘\n’两个字节,如果一个文件中的内容是:‘A’‘B’‘\r’‘\n’‘C’5个字节:

那用文本读,会得到4个字符:

字符‘A’

字符‘B’

换行符(就是‘\n’)

字符‘C’

用二进制读字节流,是5个字节:

字节0x41(‘A’)

字节0x42(‘B’)

字节0x0D(回车符)

字节0x0A(换行符)

字节0x42(‘C’)

此外,如果文件头部有标记文本格式的头部(例如utf-16大端,标识为FF FE),文本模式下也会被忽略掉。

////////////////////////////////////////////////////////////////////////////////////

因此,想要实现二进制数据读取出来能是我们所熟悉的文本格式,需要对二进制文件的文件结构非常了解,并且知道,每个部分的数据类型才能成功转换。

 

这里还有一些关于文件操作的重要链接,有兴趣的可以好好看看:

http://www.cplusplus.com/reference/cstdio/fgets/

http://www.cplusplus.com/reference/cstdio/fread/

http://www.cplusplus.com/reference/cstdio/fseek/

 

http://www.cnblogs.com/greatverve/archive/2012/10/29/cpp-io-binary.html

http://blog.csdn.net/caowei880123/article/details/5974543

http://blog.csdn.net/jiahehao/article/details/1862879

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM