最近在调试DSP程序发现一个奇怪的现象,每次用标准库函数利用仿真器读取文件系统的数据时,都只能读一小段,而且是一个固定的长度。比如文件128K,但是每次只能读到114个字节,研究了仿真器设置、编译链接脚本,包括每次32字节分块读取,都是不行。几经摸索,才发现一个很典型而以前却一直没有注意过的问题—— fopen 的参数,在很多版本的C库中fopen的第二个参数可以时"r" "w" "a",但是有一个参数"b" 很少用到,这个参数代表了文件的读写方式是二进制流,如果没有这个参数,则默认使用文本流方式读写文件,二者最大的区别在于文本流可以自动根据流中的字符控制读写停止。
简单的说,如果流里面遇到换行符'\n',回车符‘r’,EOF停止符时,读写操作函数会自动停止,比如我遇到的这个情况,流中恰好出现了数据0x1A,这在Win32以及DSP标准库里面均被定义为EOF,读到这个字符是,读写就停止了。难怪我的文件读写老是停在那个固定的位置。类似的,fgets(),getchar()等等函数则受到换行符和回车符的影响。
总结一下,在读取文件中的非文本数据时,如果fread的返回值小于预期值,则要注意下是不是应该使用二进制的方式打开文件,即:
- fp = fopen("filepath","rb");
参考文章 http://blog.csdn.net/megaboy/article/details/533333
阅读(1941) | 评论(0) | 转发(0) |