当我尝试重写计算机上现有文件中的某些行时,为什么我的程序最后打印了 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 标准支持。
背景是这样的:我搜索一个我想替换的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 标准支持。