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