[英]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 *大小和位置修改数据。
这是您当前的情况。 每条记录均以\\n
字符终止,而每一项均以\\t
字符分隔。 在这种情况下, fseek
不是您的朋友。
要访问文件中的任何记录,必须使用fscanf
逐行读取整个文件。
要修改一条记录,您应该打开临时文件并在需要修改的记录之前复制所有记录。 然后使用fprintf
写入修改后的记录。 然后将所有后续记录复制到原始文件的末尾。 之后,删除原始文件并将临时文件重命名为原始名称。
想象一下,每次读取和更新操作的速度有多慢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.