int feof(FILE *fp);
值得注意的是,函数 feof 只用于检测流文件,当文件内部位置指针指向文件结束时,并未立即置位 FILE 结构中的文件结束标记,只有再执行一次读文件操作,才会置位结束标志,此后调用 feof 才会返回为真。看下面的示例代码:int main(void) { FILE *fp=NULL; char c; fp=fopen("myfile.txt","r"); if(fp == NULL) { printf("不能够访问该文件.\n"); exit(1); } while(!feof(fp)) { c = fgetc(fp); printf("%c:\t%x\n",c,c); } fclose(fp); fp=NULL; }这里假设“myfile.txt”文件中存储的是“ABCDEF”,从表面上看,该示例代码的输出结果应该是“ABCDEF”。但实际情况并非如此,你会发现最终输出结果会多输出一个结束字符EOF(这里的 EOF 是 fgetc 函数的返回值,并不是文件中存在的 EOF),运行结果如图 1 所示。
图 1 示例代码的运行结果(Microsoft Visual Studio 2010)
int main(void) { FILE *fp=NULL; char c; fp=fopen("myfile.txt","r"); if(fp == NULL) { printf("不能够访问该文件.\n"); exit(1); } while(!feof(fp)) { c=fgetc(fp); if(c!=-1) { printf("%c:\t%x\n",c,c); } } fclose(fp); fp=NULL; }当然,也可以采用下面的这种方式进行判断:
while(true) { c=fgetc(fp); if(feof(fp)) { break; } printf("%c:\t%x\n",c,c); }或者采用如下形式:
c = fgetc(fp); while(!feof(fp)) { printf("%c:\t%x\n",c,c); c = fgetc(fp); }不论采用上述 3 种方式的哪一种,都能够得到如图 2 所示的正确结果。
图 2 示例代码的运行结果(Microsoft Visual Studio 2010)
while(!feof(fp)) { if(ferror(fp)) { perror("error"); break; } c=fgetc(fp); if(c!=-1) { printf("%c:\t%x\n",c,c); } }除此之外,最后还需要调用 clearerr 函数来清除文件出错标志和文件结束标志,将其置为 0。如下面的示例代码所示:
if(ferror(fp)) { clearerr(fp); /*************/ }
本文链接:http://task.lmcjl.com/news/14220.html