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

C语言文件读写求助:实现输入输出写入文件且保留原有数据

解决文件追加写入与资产负债比计算问题

我来帮你搞定这个问题!你现在遇到两个核心问题:一是用"w"模式写入文件会覆盖原有内容,二是代码的计算逻辑和输出格式不符合预期。下面一步步帮你修正:

问题拆解

  • 文件写入模式错误:"w"模式会清空目标文件原有内容,需要改为追加模式
  • 计算逻辑有误:DoCalcs里的变量asset和liabilites未赋值,且没有按年份分别计算比率
  • 输出格式不匹配:当前Report函数的输出完全不符合你要的表格样式
  • 输入读取逻辑需要调整:输入文件是一行数据,要正确读取组织名称和所有资产、负债数值

解决方案与修正代码

1. 修改文件打开模式

把写入文件的模式从"w"改成"a",这样新内容会追加到目标文件末尾,不会覆盖原有数据。

2. 修复计算逻辑

需要先计算每年的资产负债比,再基于这些值计算平均值,避免整数除法(要强制转成float)。

3. 完善输出格式

按照你要的表格结构,添加表头、分隔线、每年的数据行、平均值和落款。

完整修正代码

#include <stdio.h>
#include <string.h>
#include <math.h>

// 变量声明
FILE *reportfile;
FILE *inputfile;
char nameorganization[25];
int asset1, asset2, asset3;
int lia1, lia2, lia3;
// 新增每年的比率变量
float ratio1, ratio2, ratio3;
int ave_asset;
int ave_liabilites;
float ave_ratio;
// 年份数组
char *years[] = {"2010", "2011", "2012"};

// 函数声明
void ReadingData(void);
void DoCalcs(void);
void Report(void);

int main(void) {
    ReadingData();
    DoCalcs();
    Report();
    return 0;
}

void ReadingData(void){
    inputfile = fopen("c:\\class\\current.txt" , "r");
    // 读取组织名称(处理fgets带来的换行符)
    fgets(nameorganization, 25, inputfile);
    char *newline = strchr(nameorganization, '\n');
    if (newline) *newline = '\0';
    // 一次性读取所有资产和负债数值
    fscanf(inputfile,"%d %d %d %d %d %d", &asset1, &lia1, &asset2, &lia2, &asset3, &lia3);
    fclose(inputfile);
}

void DoCalcs(void){
    // 计算每年的比率,强制转float避免整数除法
    ratio1 = (float)asset1 / lia1;
    ratio2 = (float)asset2 / lia2;
    ratio3 = (float)asset3 / lia3;
    // 计算平均值
    ave_asset = (asset1 + asset2 + asset3) / 3;
    ave_liabilites = (lia1 + lia2 + lia3) / 3;
    ave_ratio = (ratio1 + ratio2 + ratio3) / 3;
}

void Report(void){
    // 使用追加模式"a"打开文件,保留原有内容
    reportfile = fopen("c:\\class\\alimbetm_cr.txt","a");
    if (reportfile == NULL) {
        printf("无法打开目标文件!");
        return;
    }

    // 按照预期格式输出
    fprintf(reportfile, "%s\n", nameorganization);
    fprintf(reportfile, "Current Ratio Report\n");
    fprintf(reportfile, "Current   Current   Current\n");
    fprintf(reportfile, "Year      Assets    Liabilities   Ratio\n");
    fprintf(reportfile, "----------------------------------------------------------\n");
    fprintf(reportfile, "%s %8d %14d %8.2f\n", years[0], asset1, lia1, ratio1);
    fprintf(reportfile, "%s %8d %14d %8.2f\n", years[1], asset2, lia2, ratio2);
    fprintf(reportfile, "%s %8d %14d %8.2f\n", years[2], asset3, lia3, ratio3);
    fprintf(reportfile, "----------------------------------------------------------\n");
    fprintf(reportfile, "Average   %8d %14d %8.2f\n", ave_asset, ave_liabilites, ave_ratio);
    fprintf(reportfile, "This report produced by Raul Jimenez.\n\n");

    fclose(reportfile);
}

关键说明

  • 追加模式"a":当文件已存在时,写入指针会自动定位到文件末尾,新内容会追加进去;如果文件不存在,会自动创建新文件。
  • 避免整数除法:在计算比率时,把其中一个操作数转成float,这样结果会是浮点数,而不是截断后的整数。
  • 输入处理:用strchr去掉fgets读取的换行符,避免输出时多出空行;用fscanf一次性读取所有数值,确保数据读取正确。
  • 格式对齐:用%8d、%14d等格式化符号,保证表格列对齐,更美观。

内容的提问来源于stack exchange,提问作者user12772128

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 15:22:27