那个循环有什么问题?

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)。这是真的,因为没有到达文件末尾。所以循环又执行了一次。