繁体   English   中英

使用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 *大小和位置修改数据。

记录大小可变

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

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

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

想象一下,每次读取和更新操作的速度有多慢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM