c语言feof() 55
第一幅图:用fgetc()再用feof(),最后一次fgetc()会返回EOF给charc虽然没法打印显示出来,但在调试窗口可以看到-1。所以一共读操作了11次。第二幅图...
第一幅图:用fgetc()再用feof(),最后一次fgetc()会返回EOF给char c 虽然没法打印显示出来,但在调试窗口可以看到-1。 所以一共读操作 了11次。第二幅图(??):除了回车符号一共只读操作 了10次,调试时读取完最后一个数字9,下一句feof()就为真了,就结束了,咋就不多读一次了,咋和第三幅图百度百科说的不一样。
展开
1个回答
展开全部
第一个代码结果是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什么也看不清,不知你要问什么问题,以上只是按主要题意猜答的。
更多追问追答
追问
可能是我没说清楚,,第一,第二幅图右边都有文件(txt)的内容,每个数字之间都有回车,遇到'\n'判断为数据结束,所以应该不是把0123456789当作一个整体。我想问的是两幅图不同的是一个用fgetc()读取一个是fscanf()为什么,第二幅图(fscanf() )为什么没想第一幅图一样多读一次。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询