我在.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 :(
答案 0 :(得分:1)
您可以使用fseek
移至第N条记录。您应该使用fgets
和fputs
进行所有读取和写入,并使用sscanf
和snprintf
来格式化缓冲区中的数据。
使用固定大小的记录,可以非常轻松地计算文件中第N条记录的位置。您可以就地更新一条记录。如果你的id被排序等,你可以使用二进制搜索来按id查找记录。
更新记录很简单,只需使用不带fseek
的顺序读取来查找正确的记录并将其替换为新记录。在按ID排序的记录上,您可以使用二进制搜索来查找正确的记录并按fseek
移动到文件中。然后替换数据。
如果您可以将文件中的位置用作记录ID,则只需一步即可找到正确的记录。 ID * SIZE只有一个fseek
并可以修改数据。
这是你目前的情况。每条记录都以\n
字符终止,每个项目由\t
字符分隔。在这种情况下,fseek
不是您的朋友。
要访问文件中的任何记录,您必须使用fscanf
逐行读取整个文件。
要修改一条记录,您应该打开临时文件并将所有记录复制到需要修改的记录之前。然后使用fprintf
编写修改后的记录。然后将所有后续记录复制到原始文件的末尾。之后,删除原始文件并将临时文件重命名为原始名称。
想象一下每次读取和更新操作的速度有多慢。