更新和删除文件的内容

时间:2014-04-27 15:53:30

标签: c string file file-io

我有一个名为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的记录。 请假设所有变量都已正确初始化。

1 个答案:

答案 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);
}