这几天在研究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