当我试图重写计算机上现有文件中的某些行时,为啥我的程序最后打印了 2 行相同的行? [复制]

Posted

技术标签:

【中文标题】当我试图重写计算机上现有文件中的某些行时,为啥我的程序最后打印了 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]当我试图重写计算机上现有文件中的某些行时,为什么我的程序最后打印了 2 行相同的行? [复制] 【发布时间】:2022-01-19 21:07:14 【问题描述】:

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

            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

【问题讨论】:

是在复制/粘贴时缩进丢失了,还是您的实际代码看起来像这样? 删除函数gets的描述以:永远不要使用这个函数开头。了解原因,您将永远不会再使用它。 您可能想阅读以下内容:Why is the gets function so dangerous that it should not be used? @EugeneSh。我是论坛的新手,我对编程世界也有点陌生,所以请忍受我的愚蠢 @SyedMuhammadIsmail 这与愚蠢无关,但如果您的实际代码真的看起来像这样,您将通过学习如何正确缩进来获得巨大的帮助。 【参考方案1】:

问题是while循环中的条件

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

这种情况只能在下面的fgets 调用之后发生。所以如果fgets遇到EOF字符串singleLine的值没有改变,它会保留之前输入的数据。结果文件的最后一行被处理了两次。

你需要写

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

注意这个调用

 fflush(stdin);

有未定义的行为。

另外,gets 函数是不安全的,并且不受 C 标准的支持。

【讨论】:

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

以上是关于当我试图重写计算机上现有文件中的某些行时,为啥我的程序最后打印了 2 行相同的行? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

当我在 wp_options 中更改 siteurl 时,我的本地网站仍然有效。为啥?

Python 冻结的可执行文件在某些​​计算机上不起作用

为啥当我使用 IIF 时,我的表中的某些行而不是其他行的日期转换失败

无法在客户端计算机上编辑水晶报告。

本地计算机上的 Windows 服务启动然后停止错误

无法在Windows上安装mysql服务器