提问人:Syed Muhammad Ismail 提问时间:12/17/2021 最后编辑:Vlad from MoscowSyed Muhammad Ismail 更新时间:12/17/2021 访问量:57
为什么当我尝试重写计算机上现有文件中的某些行时,我的程序在最后一行打印了 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]
问:
背景如下:我搜索要替换的 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;
}
答:
1赞
Vlad from Moscow
12/17/2021
#1
问题出在 while 循环中的条件
while (!feof(Fptr)){
fgets(singleLine,150,Fptr);
//...
只有在以下调用 之后,才会出现这种情况。因此,如果遇到EOF字符串的值没有更改,则保留先前输入的数据。因此,文件的最后一行被处理两次。fgets
fgets
singleLine
相反,你需要写
while ( fgets(singleLine,150,Fptr) != NULL ) {
//...
注意这个电话
fflush(stdin);
具有未定义的行为。
此外,该功能不安全,不受 C 标准支持。gets
评论
0赞
Syed Muhammad Ismail
12/17/2021
我无法在没有 fflush(stdin) 的情况下继续处理,因为我的 gets 函数不起作用。还从你们那里了解到,获得功能是不安全的。从现在开始,我将尽量不使用它,并且也会传播这个词
评论
gets