使用 fscanf 和 fprintf 更新文件

Update file using fscanf and fprintf

我在 .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移动到第N条记录。您应该使用 fgetsfputs 进行所有读取和写入,并使用 sscanfsnprintf 来格式化缓冲区中的数据。

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

更新记录很容易,只需使用不带 fseek 的顺序读取来找到正确的记录并将其替换为新记录。在按id排序的记录上,可以使用二分查找找到正确的记录并按fseek移入文件。然后就地替换数据。

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

可变记录大小

这是你目前的情况。每条记录以 \n 字符终止,每一项由 \t 字符分隔。在这种情况下 fseek 不是你的朋友。

要访问文件中的任何记录,您必须使用 fscanf.

逐行读取整个文件

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

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