【问题标题】:Updating and deleting contents of a file更新和删除文件的内容
【发布时间】:2014-04-27 15:53:29
【问题描述】:

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

【问题讨论】:

  • 尝试在以后的问题中缩进你的代码。它使阅读代码变得容易 100 倍。
  • 您没有从文件中读取任何内容。您只需打开它,然后(错误地)检查 eof 几次,然后将其关闭。还不如根本没有任何文件。
  • 有几种模式? fopen 的文档对他们每个人都有什么看法?
  • 我不是要检查你的知识,我是在告诉你从哪里开始挖掘。

标签: c string file file-io


【解决方案1】:

如果您计划更新记录,则必须同时读取和写入记录。因此“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);
}

【讨论】:

  • 例如我们必须更新 id "EMP_3" 的数据,那么如何在 fseek 设置指针位置?你能通过写一个例子的代码来解释一下吗?
  • 成功了..谢谢..我还有1个问题,如果我们想删除这条记录,那么在阅读和比较之后,我们应该如何删除它? fseek 会在其中发挥什么作用吗?如果是,那么如何。
  • user3578083,是的。 fseek() 很可能会在删除记录中发挥作用。你问如何做到这一点;也许这是另一个问题?
猜你喜欢
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多