当我试图重写计算机上现有文件中的某些行时,为啥我的程序最后打印了 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 时,我的本地网站仍然有效。为啥?