我有一个名为 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);
}
但它与 id 不匹配。所以它甚至没有更新。此外我还必须执行删除操作。我不知道如何删除具有特定 ID 的记录。 请假设所有变量都已正确初始化。
最佳答案
如果您计划更新记录,则必须同时读取和写入记录。因此“w”文件模式是不够的(即:fopen("Empdata.txt","w");
)。也许“r+”
模式更合适?
在 while()
循环中,您需要从文件中读取一条记录。
在循环的底部,您需要记下您的文件位置(即:ftell()
),以便如果下一条记录匹配,您将知道在哪里 fseek()
back to 以便将更新的记录写回文件。
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);
}
关于c - 更新和删除文件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23325505/