那个循环有什么问题?
what is the wrong with that loop?
为什么这段代码两次读取文件中的最后一个东西??谁能帮我 ??
feof 和循环有什么问题?
为什么总是不对,我试了太多次了??
提前致谢
char n [120];
char p[120];
char e [120];
char g [120];
int no;
FILE *fptr;
fptr=fopen("answer.txt","ra+");
if(fptr==NULL)
{
printf("Error!");
exit(1);
}
printf("%6s %-20s %-15s %-15s %-15s\n","Acct#","Name","Phone","Email","Group" );
printf("------ -------------------- ------------- ------------------- --------------- \n");
currentc=firstc;
while(!feof(fptr))
{
currentc= (struct contact *) malloc(sizeof(struct contact ));
fscanf(fptr,"%d",&no);
currentc->number=no;
printf("%6d: ",currentc->number);
fscanf(fptr,"%s",&n);
strcpy(currentc->name,n);
printf("%-20s ",currentc->name);
fscanf(fptr,"%s",&p);
strcpy(currentc->phone,p);
printf("%-15s ",currentc->phone);
fscanf(fptr,"%s",&e);
strcpy(currentc->email,e);
printf("%-20s ",currentc->email);
fscanf(fptr,"%s",&g);
strcpy(currentc->group,g);
printf("%-15s ",currentc->group);
}
fclose(fptr);
}
原因是您在 while 块中读取多行,但每多行检查一次 feof。问题是末尾有一个空行,它会尝试读取另一组值。但由于它们是空的,所以之前的值正在打印。
简单的答案是阅读一次并在打印前重新检查:
while(!feof(fptr))
{
fscanf(fptr,"%d", &no);
fscanf(fptr,"%s", &n);
fscanf(fptr,"%s", &p);
fscanf(fptr,"%s",&e);
fscanf(fptr,"%s",&g);
if(!feof(fptr)){
printf("%6d: ", no);
printf("%-20s ", n);
printf("%-15s ", p);
printf("%-20s ", e);
printf("%-15s \n", g);
}
}
更改您的 while 条件。不是检查 !feof(file),而是检查 fscanf 是否成功(即 fscanf()==1)。 fscanf returns 如果成功则为 1,否则为 0。
调用的最后一个 fscanf 从文件中读取最后一行,然后检查 while 循环条件 !feof(file)。这是真的,因为没有到达文件末尾。所以循环又执行了一次。
为什么这段代码两次读取文件中的最后一个东西??谁能帮我 ?? feof 和循环有什么问题? 为什么总是不对,我试了太多次了??
提前致谢
char n [120];
char p[120];
char e [120];
char g [120];
int no;
FILE *fptr;
fptr=fopen("answer.txt","ra+");
if(fptr==NULL)
{
printf("Error!");
exit(1);
}
printf("%6s %-20s %-15s %-15s %-15s\n","Acct#","Name","Phone","Email","Group" );
printf("------ -------------------- ------------- ------------------- --------------- \n");
currentc=firstc;
while(!feof(fptr))
{
currentc= (struct contact *) malloc(sizeof(struct contact ));
fscanf(fptr,"%d",&no);
currentc->number=no;
printf("%6d: ",currentc->number);
fscanf(fptr,"%s",&n);
strcpy(currentc->name,n);
printf("%-20s ",currentc->name);
fscanf(fptr,"%s",&p);
strcpy(currentc->phone,p);
printf("%-15s ",currentc->phone);
fscanf(fptr,"%s",&e);
strcpy(currentc->email,e);
printf("%-20s ",currentc->email);
fscanf(fptr,"%s",&g);
strcpy(currentc->group,g);
printf("%-15s ",currentc->group);
}
fclose(fptr);
}
原因是您在 while 块中读取多行,但每多行检查一次 feof。问题是末尾有一个空行,它会尝试读取另一组值。但由于它们是空的,所以之前的值正在打印。
简单的答案是阅读一次并在打印前重新检查:
while(!feof(fptr))
{
fscanf(fptr,"%d", &no);
fscanf(fptr,"%s", &n);
fscanf(fptr,"%s", &p);
fscanf(fptr,"%s",&e);
fscanf(fptr,"%s",&g);
if(!feof(fptr)){
printf("%6d: ", no);
printf("%-20s ", n);
printf("%-15s ", p);
printf("%-20s ", e);
printf("%-15s \n", g);
}
}
更改您的 while 条件。不是检查 !feof(file),而是检查 fscanf 是否成功(即 fscanf()==1)。 fscanf returns 如果成功则为 1,否则为 0。
调用的最后一个 fscanf 从文件中读取最后一行,然后检查 while 循环条件 !feof(file)。这是真的,因为没有到达文件末尾。所以循环又执行了一次。