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的时候,文件其实就应该完了,但是fread在k=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);//取得的字符要先经过判断
}