问题:- 在文件"客户。DAT' 结构客户有 100 条记录。在另一个文件中"事务。DAT' 有几条结构为 trans 的记录
元素trans_type包含指示存款或取款金额的D/W。编写一个程序来更新"客户"。DAT"文件,即,如果trans_type为"D",则更新"客户"的余额。DAT",通过将金额添加到相应帐户的余额中。同样,如果trans_type为"W",则从余额中减去金额。
如果我在 txt 模式下打开文件,即在"r"和"w"中打开文件,我可以逐行比较文件中的数据,但是当我以二进制"rb"wb"打开时,我无法逐行比较数据。怎么办?
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
struct customer
{
int accno ;
char name[30] ;
float balance ;
};
struct trans
{
int accnum ;
char trans_type ;
float amount ;
} ;
int main()
{
FILE *fs,*ft,*f1;
struct customer c;
struct trans tr;
fs = fopen("customer.txt","rb");
if (fs==NULL)
{
printf("Can't open file.");
exit(1);
}
f1 = fopen("transactions.txt","rb");
if (f1==NULL)
{
printf("Can't open file.");
exit(2);
}
ft = fopen("temp.txt","wb");
if (ft==NULL)
{
printf("Can't open file.");
exit(3);
}
while(fread(&c,sizeof(c),1,fs)==1)
{
while(fread(&tr,sizeof(tr),1,f1)==1)
{
if( tr.accnum == c.accno && tr.trans_type == 'D')
{
c.balance = c.balance + tr.amount;
break;
}
else if( tr.accnum == c.accno && tr.trans_type == 'W')
{
if(c.balance - tr.amount < 100)
break;
else
c.balance = c.balance - tr.amount;
break;
}
}
fwrite(&c,sizeof(c),1,ft);
}
fclose(fs);
fclose(f1);
fclose(ft);
remove("customer.txt");
rename("temp.txt","customer.txt");
return 0;
}
客户.txt中的数据示例为
1阿曼456.45
2洛马 199.40
3 沙伊 15
事务中的数据示例.txt为
1 天 500.89
3 瓦 51.00
2 瓦 40
其中D是存款,w是取款
文件数据编码为文本。 不要使用需要固定长度二进制数据的fread()
读取数据。
以文本模式打开文件并使用fgets()
读取数据行。
char buffer[100];
if (fgets(buffer, sizeof buffer, fs)) {
// Now process the data
让我们使用sscanf()
处理数据。 查找格式不正确的数据。 使用" %n"
记录尾随非空格文本的偏移量。
struct trans tr;
int n = 0;
sscanf(buffer, "%d %c %f %n", &tr.accnum, &tr.trans_type, &tr.amount, &n);
// Was scanning incomplete or extra junk at the end or non W,D?
if (n == 0 || buffer[n] != 0 ||
(tr.trans_type != 'W' && tr.trans_type != 'D')) {
fprintf(stderr, "Bad input <%s>n", buffer);
break;
}
// Use `t`.
}
到了写作的时候,用足够的精度写出一个独特的float
。
fpritnf(fs, "%d %c %.9gn", t.accnum, t.trans_type, t.amount);