读文件使用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

 

你可能感兴趣的:(文件)