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
相关产品推荐
相关产品推荐

