我正在创建此更改功能。 void cha(struct cont x);
,它会询问lname,然后检查它是否在文件中。之后,它将编辑。再次请求lname和fname。它可以工作,但它写在文件的底部。
struct cont
{
char lname[20];
char fname[20];
}s;
void cha(struct cont x)
{
FILE *fp;
char lname[20];
int flag=0;
fp=fopen("database.dat","a+");
if(fp==NULL)
{
printf("file error");
}
else
{
printf("\nenter lname: ");
gets(lname);
while(fscanf(fp,"%s %s",x.lname,x.fname)==2)
{
if(strcmp(lname,x.lname)==0)
{
printf("enter lname: ");
gets(x.lname);
printf("enter fname: ");
gets(x.fname);
fseek(fp,-sizeof(x),SEEK_CUR);
fprintf(fp,"%s %s\n",x.lname,x.fname);
flag=1;
break;
}
}
if(flag==1)
{
printf("success!");
}
else
{
printf("data not found.");
}
}
fclose(fp);
}
答案 0 :(得分:4)
fp=fopen("database.dat","r");
您已在读取模式下打开文件,并且您正在尝试写入文件
fprintf(fp,"%s %s\n",x.lname,x.fname);
使用a+
以附加模式打开文件。
gets()
不再是标准,并使用fgets()
来处理缓冲区溢出。
男人说:
A +
打开阅读和追加(在文件末尾写)。该文件是 如果它不存在则创建。读取的初始文件位置是 在文件的开头,但输出始终附加到结尾 该文件。
答案 1 :(得分:1)
只需将其写入另一个文件
即可FILE *newFile = fopen("newDatabase.dat","w");
if(strcmp(lname,x.lname)==0)
{
//scan data to tmp var
fprintf(newFile ,"%s %s\n",x2.lname,x2.fname);
}
else
{
//write original var
fprintf(newFile ,"%s %s\n",x.lname,x.fname);
}
然后,您可以更改新文件的名称,以覆盖旧文件的重要名称