feof()出现的问题及解决办法

C语言feof()函数的使用

正确的应该是feof返回0表示文件没有结束,返回1,表示结束。feof实际观察的是上次读操作的内容,也就是上次读操作fread返回的值,如果读操作的返回值表明读取的不是空,那feof就返回0,如果上次读操作失败了,则feof返回1,表示读取完了。而fread返回值是表示正确读取的块数,如果不够,则返回0。那么我们看一下下面的程序:

while(1)

{

  if(feof(fp1))

  {

    break;

  }

  else

  {

    tmpint = fread(&(tmp[k]),1,1,fp1);

    k++;

  }

}

如果fp1指向的文件有256个字节,那么运行结束后,k的值为257。原因是由于在fread读取k=255的时候,文件其实就应该完了,但是freadk=255这次读取中,其返回值是1,因此进入k=256循环后,feof仍然返回的是1。因此k++也会再执行一次,因此,k变成了257。当进入k=257循环内,feof发现上次读操作失败了,因为上次fread返回了0,此刻break。最后k=257,比实际的文件大小大了一。所以在用feof的时候要多多注意

 

解决方法:

fgets(str,80,fp);

while(!feof(fp)) //fgets取值成功,feof()返回0,fp指针偏移量向后移动一个字节,fgets取值失败feof()返回EOF

{

   fputs(str,stdout);

   fgets(str,80,fp);

}

fputc(ch ,fp)//成功返回ch,错误返回0

ch = fgetc(fp)//成功返回所得的字符,出错或者失败返回EOF

 

fgets(str,80,fp); //成功返回str的地址,出错或者失败返回NULL

fputs()//成功返回0,出错返回非零

fprintf(FILE *fp,char *format,args,...)//把args的值以format指定的格式输出到fp所指定的文件中,成功返回实际输出的字符数

fcanf(fp,char *format,args...)//把fp指定的文件按format指定的格式将数据送到arg所指定的内存,成功返回输入数据的个数,失败返回-1

 

int fread(char *pt,unsigned size,unsigned n,FILE *fp)//从fp所指定的文件中读取长度为size的n个数据项,存到fp所指向的内存区,成功返回所读的数据项个数,如遇文件结束或者出错返回0

int fwrite(char *ptr,unsigned size, unsigned n,FILE*fp)//把ptr所指向的n*size个字节输出到fp所指向的文件,成功返回写到fp文件里的数据项个数

 

while(fgets() != NULL)

{  

  fputs(str,stdout); //先打印

   fgets(str,80,fp);//取得的字符要先经过判断

}

 

 

posted on 2013-12-19 10:37  思过崖  阅读(3893)  评论(0编辑  收藏  举报