You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:36:00