我有一个名为Empdata.txt的文件,其字段为“(%s)id,(%s)name,(%d)salary”。首先,我要插入一些值。现在我想更新具有用户给出的相同id的记录。我正在使用此代码:
struct employee
{
char id[100];
char name[100];
int sal;
};
int main()
{
FILE *ptr;
struct employee e;
ptr=fopen("Empdata.txt","w+");
printf("Enter Employee id");
scanf("%s",id);
while(!feof(ptr))
{
fread(&e,sizeof(e),1,ptr);
if(strcmp(id,e.id)==0)
{
printf("Enter name");
scanf("%s",e.name);
printf("Enter basic salary");
scanf("%d",&e.sal);
fwrite(&e,sizeof(e),1,ptr);
}
};
fclose(ptr);
}
但它与ids不匹配。所以它甚至没有更新。此外,我还必须执行删除操作。我没有得到如何删除具有特定ID的记录。 请假设所有变量都已正确初始化。
答案 0 :(得分:0)
如果您计划更新记录,则必须同时读取和写入记录。因此" w"文件模式不足(即:fopen("Empdata.txt","w");
)。也许"r+"
模式更合适?
在while()
循环中,您需要从文件中读取记录。
在循环的底部,您需要记下您的文件位置(即:ftell()
),这样如果下一条记录匹配,您将知道返回到fseek()
的位置以便写入更新后的记录回到文件中。
long position=0;
...
while(!feof(ptr))
{
fread(&e,sizeof(e),1,ptr);
if(strcmp(id,e.id)==0)
{
...
}
position=ftell(ptr);
};
如果找到匹配的记录(即:if(strcmp(id,e.id)==0)
),你应该做的最后一件事是重新定位到匹配记录的开头(即:fseek()
),然后写下更新记录。既然你已经完成了你的任务,你应该打破while循环并返回。
{
...
fseek(ptr, position, SEEK_SET);
fwrite(&e,sizeof(e),1,ptr);
}