码迷,mamicode.com
首页 > 其他好文 > 详细

读文件使用feof()多读一次的问题

时间:2014-09-28 22:51:36      阅读:338      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   使用   文件   sp   div   

读文件使用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()多读一次的问题

标签:style   blog   http   color   io   使用   文件   sp   div   

原文地址:http://www.cnblogs.com/leijiangtao/p/3999034.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!