使用fscanf和fprintf更新文件

时间:2015-04-19 16:42:26

标签: c printf scanf

我在.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 :(

1 个答案:

答案 0 :(得分:1)

固定记录大小

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

使用固定大小的记录,可以非常轻松地计算文件中第N条记录的位置。您可以就地更新一条记录。如果你的id被排序等,你可以使用二进制搜索来按id查找记录。

更新记录很简单,只需使用不带fseek的顺序读取来查找正确的记录并将其替换为新记录。在按ID排序的记录上,您可以使用二进制搜索来查找正确的记录并按fseek移动到文件中。然后替换数据。

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

可变记录大小

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

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

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

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