重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
即使文件是空的,也要再读一次,feof函数值才会变为真。
网站制作、成都网站建设介绍好的网站是理念、设计和技术的结合。创新互联公司拥有的网站设计理念、多方位的设计风格、经验丰富的设计团队。提供PC端+手机端网站建设,用营销思维进行网站设计、采用先进技术开源代码、注重用户体验与SEO基础,将技术与创意整合到网站之中,以契合客户的方式做到创意性的视觉化效果。
因为只有读出所有的数据之后,再读一次,函数feof(fp)的返回值才为真。(请见《C语言好程序设计—从入门到进阶》,人民邮电出版社,2011。)
示例:
#includestdio.h
#includestdlib.h
main()
{
FILE *fp;
int a;
if((fp=fopen("c:\\number.txt","r"))==NULL)
{
printf("文件打开失败!\n");
exit(0);
}
fscanf(fp,"%d",a);
while(!feof(fp)) /*等价于while(feof(fp)==0)*/
{
printf("%d ",a);
fscanf(fp,"%d",a);
}
fclose(fp);
}
fwrite源代码为:
size_t fwrite (const void* ptr,size_t size,size_t nmemb,FILE *fp);
头文件在search.h中,有的在stddef.h中
fread源代码为:
size_t fread(const void* ptr,size_t size,size_t nmemb,FILE *fp);
函数参数与fwrite相同
他是指读到文件的末尾!!你可以查看相关文档 !!!! 很好理解的!!fscanf 是文件的 输入输出 ! printf是输出到控制台上!!!! 呵呵 没有什么大的不同 就一个函数而已 !!! 只是函数的调用过程中的参数不一样!!!
第一个代码结果是11不错,但第二个就不是10了,应该是2——第一个代码用fgetc读,它把结束符也当一个字符读取了,当然'\n'也被读取了,共读了12个,但c=='\n'时被否定了,num没有增值,所以最后num是11;第二个代码显然只能把0123456789当一个整数来读(遇到'\n'判断为数据结束),所以一次就读完了,之所以最后num是2,是因为一次读完后并没有越过文件结尾产生读操作,所以feof不可能返回“真”,还要再读一次才产生错误,所以结果是2。这里有个问题必须注意:feof这个函数不产生读文件操作,只检查刚刚发生的读操作是否越过文件结尾了,所以要在逻辑上紧跟在读操作函数之后才能正确发挥作用。从这点上说,这两款代码都有错误,应该这么写:
(1)代码改如下:
#include "stdio.h"
int main(){
FILE *fp;
int num=0;
//int a;
char c;
if((fp=fopen("D:\\a.txt","r"))==NULL){
printf("打开文件时发生错误...\n");
return 0;
}
while(1){
c=fgetc(fp);
if(feof(fp))//把判断提前到这里来,处理过了再判断毫无意义
break;
if(c!='\n'){
num++;
printf("%c\n",c);
}
}
printf("\n%d\n",num);
fclose(fp);
return 0;
}
(2)代码改如下:
#include "stdio.h"
int main(int argv,char *argc[]){
FILE *fp;
int num=0;
int a;
//char c;
if((fp=fopen("D:\\a.txt","r"))==NULL){
printf("打开文件时发生错误...\n");
return 0;
}
while(1){
fscanf(fp,"%d",a);
if(feof(fp))
break;
num++;
printf("%d\n",a);
}
printf("\n%d\n",num);
fclose(fp);
return 0;
}
这样改后前者结果就应该是10,后者结果就应该是1。相信不会有错。——由于图3什么也看不清,不知你要问什么问题,以上只是按主要题意猜答的。
while(1)
{
fread(a[j],sizeof(struct stu),1,fp);/*这里一旦读到结束位置,后面输出应停止,所以在fread后面增加判断即可*/
if(feof(fp)) break;
printf("%10d",a[j].a);
printf("%10s",a[j].b);
printf("%10s",a[j].c);
printf("%10.2lf",a[j].d);
printf("%10d",a[j].e);
printf("%10.2lf\n",a[j].f);
j++;
}
fclose(fp);
}
原因:
当遇到文件结束标志,不立即结束而再执行后面几个printf才结束,会由于%s输出遇不到字符串结束标志而一直向下输出,后面内容是随机的,当遇到字符串结束标志才停止。至于在那里停止,没有办法固定,要看内存单元%s正在访问位置是否是字符串结束标志。
feof是c标准函数,原型:int feof(FILE *stream)是feof函数原型,文件结束返回非0值,否则返回0。fp对应上面的文件流,!是bool取反的意思,!feof(fp)组合起来就是文件尚未结束的逻辑。