读文件使用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
时间: 2024-12-24 03:49:49