Chinaunix首页 | 论坛 | 博客
  • 博客访问: 142565
  • 博文数量: 25
  • 博客积分: 100
  • 博客等级: 中士
  • 技术积分: 310
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-03 18:56
文章分类

全部博文(25)

文章存档

2012年(4)

2011年(21)

分类: C/C++

2011-09-02 22:35:11

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

总结一下,在读取文件中的非文本数据时,如果fread的返回值小于预期值,则要注意下是不是应该使用二进制的方式打开文件,即:

  1. fp = fopen("filepath","rb");

参考文章 http://blog.csdn.net/megaboy/article/details/533333
阅读(1948) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~