C语言读取双文件匹配账号合并余额,fread执行失败如何解决?
现有代码的问题
fread仅适用于读取二进制格式存储的文件,你的两个文件都是格式化纯文本文件,无法直接按结构体内存块大小读取解析,这是读取失败的核心原因。- 你定义的
clientData是4字段结构体,匹配第二个账户文件的结构,但你当前读取的第一个交易文件只有2列字段,结构体和文件内容格式不匹配。 - 文本文件没有固定的记录长度,你调用
fseek按结构体大小偏移的操作是二进制文件的用法,用于文本文件会直接跳转到错误的文件位置。 - main函数返回值为int类型,你出错分支的
return;没有返回整数,不符合C语言语法规范。
需求实现方案
实现逻辑为:先加载所有账户数据到内存,再遍历交易数据更新对应账户余额,最后输出更新后的账户数据。
完整示例代码如下:
#include <stdio.h> #include <string.h> #define MAX_ACCOUNT 100 // 可根据实际账户数量调整 struct clientData{ unsigned int acctNum; char name[20]; char surname[20]; double balance; }; struct transData{ unsigned int acctNum; double amount; }; int main(){ struct clientData accounts[MAX_ACCOUNT]; int accountCnt = 0; FILE *fPtr, *fPtr2; char buf[100]; // 用于读取表头行 // 第一步:读取账户文件所有数据 if(!(fPtr = fopen("account_file.txt", "r"))){ printf("[ERROR] Account file could not be found!\n"); return 1; } // 跳过表头行 fgets(buf, sizeof(buf), fPtr); // 逐行读取账户数据 while(fscanf(fPtr, "%u %s %s %lf", &accounts[accountCnt].acctNum, accounts[accountCnt].name, accounts[accountCnt].surname, &accounts[accountCnt].balance) == 4){ accountCnt++; if(accountCnt >= MAX_ACCOUNT) break; } fclose(fPtr); // 第二步:读取交易文件更新余额 if(!(fPtr2 = fopen("transaction_file.txt", "r"))){ printf("[ERROR] Transaction file could not be found!\n"); return 1; } // 跳过表头行 fgets(buf, sizeof(buf), fPtr2); struct transData trans; while(fscanf(fPtr2, "%u %lf", &trans.acctNum, &trans.amount) == 2){ // 查找匹配的账号 for(int i=0; i<accountCnt; i++){ if(accounts[i].acctNum == trans.acctNum){ accounts[i].balance += trans.amount; break; } } } fclose(fPtr2); // 第三步:输出更新后的账户数据,可改为写回原文件 printf("%-16s%-16s%-16s%s\n", "Account Number", "Name", "Surname", "Balance"); for(int i=0; i<accountCnt; i++){ printf("%-16u%-16s%-16s%.2lf\n", accounts[i].acctNum, accounts[i].name, accounts[i].surname, accounts[i].balance); } return 0; }
注意:代码中账户文件名请替换为你实际的第二个文件的文件名,若要将结果写回文件,将最后一步的printf改为fprintf写入文件即可。
内容的提问来源于stack exchange,提问作者akoluacik
相关产品推荐
相关产品推荐

