feof函数详解
网上很多feof讲解的很模糊,百看不如一试,经过笔者在编译器的亲自测试之后总结如下:
第一种情况:
如果没有使用fread读取文件而直接使用feof函数得到的返回值是0;
第二种情况:
使用fread读取文件,假设使用fread(buf,1,1,filp) 一个字节一个字节的进行读取,如果没有读到文件的结尾,那么feof返回值都是0,直到读到文件结尾那么返回值就是1
例如:假设要读取的文件名字为txt,文件内容是 hi
程序是:
char buf[10];
FILE *filp = fopen(“./txt”,”rw”); //笔者在linux下测试,./txt表示本目录下的txt文件
printf(“%d\n”,feof(fip)); //打印 0 没有调用fread 必然打印0
fread(buf,1,1,filp);
printf(“%d\n”,feof(fip)); //打印 0 读取第一个字节h
fread(buf,1,1,filp);
printf(“%d\n”,feof(fip)); //打印 0 读取第二个字节i
fread(buf,1,1,filp);
printf(“%d\n”,feof(fip)); //打印 0 读取第三个字节---换行符!!
fread(buf,1,1,filp);
printf(“%d\n”,feof(fip)); //打印1 读取文件结束
所以需要注意的有两点一个是没有使用fread直接用feof会返回0,另一个就是换行符也算是要读取的一个字节,所以如果文件是空的,使用fread之后调用feof也会返回0,因为空文件也是先读取换行符! 然后再次fread之后使用feof就是1了。
第三种情况:
使用fread以n个字节为单位进行读取,例如以4个字节为一组,fread(buf,4,1,filp),如果在4个字节中包含了文件结束符,那么返回的就是1
例如:
例如:假设要读取的文件名字为txt,文件内容是 kkk
那么程序这样:
char buf[10];
FILE *filp = fopen(“./txt”,”rw”); //笔者在linux下测试,./txt表示本目录下的txt文件
printf(“%d\n”,feof(fip)); //打印 0 没有调用fread 必然打印0
fread(buf,4,1,filp);
printf(“%d\n”,feof(fip)); //打印0 因为kkk加上换行符正好是4个字节
而如果txt的内容是 kk
fread(buf,1,1,filp);
printf(“%d\n”,feof(fip)); //打印1 因为4个字节是 kk+换行符+文件结束符 包含了文件结束符就会打印1