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