今天在写资源管理器的时候,加载音频文件,发现文件头的格式对不上,刚开始觉得是读头的逻辑出错了,在vs下用Debug的Memory和用hex格式对比发现,最终是发现内存没有加载全只是加载了一部分的缘由,是读到了0x1ahtml
google了一下,发现本身打开文件的方式不对,我使用的是:windows
FILE* file = fopen( path, "r");
而正确的应该是:google
FILE* file = fopen( path, "rb");
为何是这样子呢,由于若是用"r"模式打开,字符是有意义的,只要是读到0x1A时,fread就认为是结束。为何是0x1a,而不是别的,写个小例子输出一下ctrl + z的ascii码值发现,它的ascii码值就是26在windows上(Linux是挂起任务)。spa
但你以"rb"读到文本,系统IO只会认为它是文本而非别的东西。插件
推荐一个HEX查看器,当资源和内存数据不符的时候,Hex格式的查看显得比较重要了。Notepad++的一个插件,Hex Editor.htm
解压缩后把HexEditor.dll文件复制到安装目录(如:Dir\Notepad++\plugins),退出NotePad++从新打开便可!须要以十六进制显示时,点击菜单的:【插件】-【Hex-Editor】-【View in Hex】便可。由于是在sf上,FQ比较麻烦,直接博客园的下载地址:http://files.cnblogs.com/singmelody/HexEditor_0_9_5_UNI_dll.zipblog
reference: ip
1.http://blog.sina.com.cn/s/blog_4e0987310101o9xl.html内存
2.http://shandian.biz/490.htmlci