首页 > 代码库 > 读文件使用feof()多读一次的问题
读文件使用feof()多读一次的问题
读文件使用feof()多读一次的问题这是一个经典的错误, 很多教科上都是这么写的。 在读完文件的最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多执行了一次。 对于feof()这个函数, 它是先读再判断是否到文件尾, 也就是说在它之前一定要读一次才能做出判断。 而我们经常这样把它使用在循环中:int c; while(!feof(fp)) { c = fgetc(fp); printf("%x\n",c); } 它是先判断==>再读(可能这时就是文件尾了, 读不出东西了) 所以正确的代码应该是int c; c = fgetc(fp); while(!feof(fp)) { printf("%x\n",c); c = fgetc(fp); } 看出上面两段代码的区别了吧!!! 第二种方法就是:(不使用feof,换种方法。) 1、把文件内部指针移动到文件尾部。fseek(fp,0,2);2、用一个整形变量记录这个文件尾部的位置wjcd = ftell(fp); 3、把文件内部指针移到到文件头部;fseek(fp,0,0); 4、这样就可以了while(wjcd == ftell(fp))注: 1) 欲将读写位置移动到文件开头时:fseek(FILE *stream,0,SEEK_SET);2) 欲将读写位置移动到文件尾时:fseek(FILE *stream,0,SEEK_END);参数SEEK_SET是从距文件开头offset位移量为新的读写位置;SEEK_CUR是以目前的读写位置往后增加offset个位移量;SEEK_END将读写位置指向文件尾后再增加offset个位移量。当whence值为SEEK_CUR或SEEK_END时,参数offset允许负值的出现。http://blog.sina.com.cn/s/blog_705a5ff00101ab5d.html
读文件使用feof()多读一次的问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。