c语言feof() 55

第一幅图:用fgetc()再用feof(),最后一次fgetc()会返回EOF给charc虽然没法打印显示出来,但在调试窗口可以看到-1。所以一共读操作了11次。第二幅图... 第一幅图:用fgetc()再用feof(),最后一次fgetc()会返回EOF给char c 虽然没法打印显示出来,但在调试窗口可以看到-1。 所以一共读操作 了11次。第二幅图(??):除了回车符号一共只读操作 了10次,调试时读取完最后一个数字9,下一句feof()就为真了,就结束了,咋就不多读一次了,咋和第三幅图百度百科说的不一样。 展开
 我来答
White_MouseYBZ
2018-01-14 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6515万
展开全部

第一个代码结果是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() )为什么没想第一幅图一样多读一次。
追答

如果每两个数字间有'\n',那我改后都应该是10。如果不改,也都应该是11。请看:

不过我觉得你那里如果确实是10的话也是有可能的,因为没有按把feof紧跟在读操作之后,编译器商家在一些边缘细节上的处理不尽相同,造成对fscanf函数的细节解释产生了差异——只是猜测而已。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式