【问题标题】:Update file using fscanf and fprintf使用 fscanf 和 fprintf 更新文件
【发布时间】:2015-04-19 16:42:25
【问题描述】:

我在 .txt 文件中有这样的制表符分隔记录

1000    Aashir  0213-4211685    123456  0
1001    Muhammad Ali    0334-3387918    abcd    0
1002    Azam    0323-2143133    hassan123   0
1003    Taha Hashmi 0214-6589421    786 0
1004    Khan    03452145698 helloworld  0

现在我想使用 fscanf 和 fprintf 更新或修改这些值

这是我迄今为止尝试过的,但现在我被困在如何在特定位置上写字

void update_record(Account* user)
{
FILE *record;int i=0;
record=fopen("database.txt","a+");
char buffer[SIZE];Account req;
while(fgets(buffer,SIZE,record))
{
    sscanf(buffer,"%d\t%[^\t]\t%s\t%s\t%ld\n",&req.acc_num,req.name,req.mobileno,req.pass,&req.acc_bal);
    ++i;
    if(req.acc_num==user->acc_num){
        fseek(record,SIZE*i-1,SEEK_SET);
        fprintf(record,"%d\t%s\t%s\t%s\t%ld\n",user->acc_num,user->name,user->mobileno,user->pass,user->acc_bal);

        cout<<"\nFIle updated ";
        fclose(record);
        break;

    }
}

return;


}

我是初学者,请帮忙,我只能使用 fscanf 和 fprintf,#assignmentcriteria :(

【问题讨论】:

  • 你必须做 fseek 去特定的位置
  • 另一个问题 fscanf 是否将文件指针更改为下一行?
  • 问题是你不能真正同时读取和写入同一个文件,当它是一个没有固定大小记录的文本文件时更是如此。通常的解决方案是从文件中一次读取一行,修改要修改的行,然后将这些行写入临时文件,然后将临时文件重命名为实际文件。
  • 我已经使用 fseek 更新了代码,但它不起作用请帮忙?
  • 删除fseek()。更新时,1) 使用更新的记录创建新文件。 2)删除旧的原始文件 3)将新文件重命名为旧名称。

标签: c printf scanf


【解决方案1】:

固定记录大小

您可以使用fseek 移动到第 N 条记录。您应该使用fgetsfputs 进行所有读取和写入,使用sscanfsnprintf 格式化缓冲区中的数据。

使用固定大小的记录,很容易计算第 N 条记录在文件中的位置。您可以就地更新一条记录。您可以使用二进制搜索按 id 查找记录,如果您的 id 已排序等。

更新记录很容易,只需使用没有fseek 的顺序读取来找到正确的记录并用新记录替换它。在按 id 排序的记录上,您可以使用二进制搜索来找到正确的记录并通过fseek 移入文件。然后就地替换数据。

如果您可以使用文件中的位置作为记录ID,那么找到正确的记录只是一步。它只是一个fseek 到 ID*SIZE 并就地修改数据。

可变记录大小

这是你目前的情况。每条记录都以\n 字符结尾,每条记录以\t 字符分隔。在这种情况下,fseek 不是你的朋友。

要访问文件中的任何记录,您必须使用fscanf逐行读取整个文件。

要修改一条记录,您应该打开临时文件并复制您需要修改的记录之前的所有记录。然后使用fprintf 写入修改后的记录。然后将所有后续记录复制到原始文件的末尾。之后,删除原始文件并将临时文件重命名为原始名称。

想象一下每次读取和更新操作会有多慢。

【讨论】:

  • 我使用 fseek 编辑了我的代码,但它不起作用你能找出错误吗?
  • 问题是文件格式,如果你不能把它改成固定的记录大小,就忘了fseek。您的更新功能应该只适用于文件,其中每一行都是 SIZE 字节长度。
  • 我刚刚更新了答案,所以现在更清楚了。
猜你喜欢
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2019-10-13
相关资源
最近更新 更多