当我尝试重写计算机上现有文件中的某些行时,为什么我的程序最后打印了 2 行相同的行?

Why is my program printing 2 same lines in the last when I tried to rewrite some lines in an existing file on my computer?

背景是这样的:我搜索一个我想替换的ID,然后我查看我的文件MedicalStore.txt寻找它。如果我找到它,我会用文件中以前不存在的另一行或记录替换它。我创建了另一个临时文件并复制粘贴了所有数据,但搜索到的 ID 除外,我使用 If 条件替换了它。我也会附上文件。

            Modify(int SiD){
            struct customerinfo{
            char Prefix[20];
            char Name[20];
            int ID;
            unsigned long int Pnum;
            };
            struct customerinfo customer;
            FILE * Fptr;
            FILE * Ftemp;
    Fptr = fopen("MedicalStore.txt","r");
    Ftemp = fopen("replace.txt","w");
    char singleLine[150],newline[150],prefix[10],name[20];
    int id,c=0;
    unsigned long int num;
    while (!feof(Fptr)){
    fgets(singleLine,150,Fptr);
    c++;
    sscanf(singleLine,"%s %s %d %d\n",prefix,name,&id,&num);
    //printf("%s %s %d %d\n",prefix,name,id,num);
    if (id == SiD){
    strcpy(customer.Prefix,"Customer");
    printf("Enter Customer Name:\n");
    fflush(stdin);
    gets(customer.Name);
    printf("Enter unique ID of Customer : ");
    scanf("%d",&customer.ID);
    printf("Enter phone number of customer : ");
    scanf("%d",&customer.Pnum);
    printf("%d",customer.Pnum);
    sprintf_s(newline,150, "%s %s %d %d\n",customer.Prefix,customer.Name,customer.ID,customer.Pnum);
    fputs(newline,Ftemp);
    } else {
    fputs(singleLine,Ftemp);
    }
    }
    fclose(Fptr);
    fclose(Ftemp);
    remove("MedicalStore.txt");
    rename("replace.txt","MedicalStore.txt");
    return 0;
    }

Before editing with the code I replaced the 2nd line with another record

问题出在while循环中的条件

while (!feof(Fptr)){
fgets(singleLine,150,Fptr);
//...

只有在 fgets 的以下调用之后才会出现该条件。因此,如果 fgets 遇到 EOF,则字符串 singleLine 的值不会更改,它会保留先前输入的数据。结果文件的最后一行被处理了两次。

你需要写成

while ( fgets(singleLine,150,Fptr) != NULL ) {
//...

注意这个调用

 fflush(stdin);

有未定义的行为。

此外,函数 gets 不安全,不受 C 标准支持。