判断文件读取是否到了结尾有两种方式,一种是判断fgetc()是否返回EOF(即-1,一个宏定义);另一中是使用feof()函数判断,如果结束返回1,否则返回0;
第一种方式局限性很大,因为只有fgetc(),fscanf()遇到结束返回EOF,其他函数fgets()返回char*;另外用while((c = fgetc()) != EOF)也不安全,因为对于二进制非文本文件,这些文件在还没结束的地方可能就会存有-1,结果这里认为结束了。因此这种判断方式之针对纯文本文件有效(因为纯文本文件都是可打印字符,中间不会存在-1的值),对二进制文件是不安全的。建议少用。
第二种方式feof()也是一段宏函数,他是通过判断FILE结构体里面的文件状态标志实现的。并且这种方法是通用的。建议判断是否结束用这种方法。
#include<stdio.h>
#include<unistd.h>
int main(){
FILE *fp = fopen("log","r");
char buf[128] = {'\0'};
if(fp == NULL){
printf("failed to open file!\n");
return -1;
}
//fscanf(fp,"%s",buf);
//printf("readline%d:%s\n",0,buf);
int i = 1;
while(!feof(fp)){
fscanf(fp,"%s",buf);
printf("readline%d:%s\n",i,buf);
sleep(1);
i++;
}
fclose(fp);
return 0;
}
feof()会多读一行才结束。另外fscanf遇到空格或者换行即结束。并且这个空格/换行不会被读取。