为什么当我尝试重写计算机上现有文件中的某些行时,我的程序在最后一行打印了 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? [duplicate]

提问人:Syed Muhammad Ismail 提问时间:12/17/2021 最后编辑:Vlad from MoscowSyed Muhammad Ismail 更新时间:12/17/2021 访问量:57

问:

背景如下:我搜索要替换的 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;
    }

在使用代码进行编辑之前,我用另一条记录替换了第 2 行

C if-statement 文件处理 EOF

评论

4赞 Eugene Sh. 12/17/2021
缩进是在复制/粘贴时丢失的,还是您的实际代码看起来像这样?
1赞 Ted Lyngmo 12/17/2021
已删除函数的描述以:永远不要使用此函数开头。阅读原因,您将永远不会再使用它。gets
1赞 Andreas Wenzel 12/17/2021
您可能想阅读以下内容:为什么 gets 函数如此危险以至于不应该使用它?
0赞 Syed Muhammad Ismail 12/17/2021
@EugeneSh。我是论坛的新手,也是编程界的新手,所以请忍受我的愚蠢
0赞 Eugene Sh. 12/17/2021
@SyedMuhammadIsmail 这与愚蠢无关,但是如果您的实际代码真的看起来像这样,您将通过学习如何正确缩进它来帮自己一个巨大的忙。

答:

1赞 Vlad from Moscow 12/17/2021 #1

问题出在 while 循环中的条件

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

只有在以下调用 之后,才会出现这种情况。因此,如果遇到EOF字符串的值没有更改,则保留先前输入的数据。因此,文件的最后一行被处理两次。fgetsfgetssingleLine

相反,你需要写

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

注意这个电话

 fflush(stdin);

具有未定义的行为。

此外,该功能不安全,不受 C 标准支持。gets

评论

0赞 Syed Muhammad Ismail 12/17/2021
我无法在没有 fflush(stdin) 的情况下继续处理,因为我的 gets 函数不起作用。还从你们那里了解到,获得功能是不安全的。从现在开始,我将尽量不使用它,并且也会传播这个词