c - 更新和删除文件内容

标签 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);
}

但它与 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/

相关文章:

c++ - sizeof() 运算符为数组和指向数组的指针返回不同的值

python - python中的while循环,输入和字符串有问题

string - 如何在agda中将数字转换为字符串?

php - 是否可以从 DateInterval 对象中获取 "interval_spec"字符串?

file - 使用 GWT 列出目录中的文件

android - 哪个更快? Android 中的 SharedPreference 或文件

c++ - 什么类型的 API 或算法用于生成 session ID?

c - Linux 上的超低延迟编程,从哪里开始?

c - C 中除以浮点值时出现错误

android - 如何为android中的所有联系人创建一个.vcf文件