C语言如何将学生成绩计算各模块结果全部写入同一TXT文件
作业原始要求
本次作业给定的lab1.txt文件内容如下:
JOAN 1 70.5 85 TANIA 2 49 75 TOM 3 53 54 JEFF 4 80 49.5 SUSAN 5 89 90 KATHY 6 99 55 RAYMOND 7 22.5 75
需要程序读取该文件完成以下计算:
- a) 计算获得毕业证的人员(输出姓名、成绩)
- b) 按科目A成绩升序排序(标注对应学生姓名、学号、科目B成绩)
- c) 计算每门科目的平均分和标准差
- d) 数据从外部文件读取,运行时先按格式展示原始数据,所有输出结果同时在屏幕展示并写入外部文件
New_Data.txt
现有问题
已完成a、b、c三个模块的逻辑开发,目前仅能将原始文件内容复制到New_Data.txt,不知道如何追加三个模块的计算结果到同一个文件,当前已实现代码如下:
ptrCf = fopen ( "lab1.txt", "r" ); ptrCf2 = fopen ( "New_Data.txt" , "w" ); while ( (data1 = fgetc ( ptrCf )) != EOF ) { fputc ( data1, ptrCf2 ); } rewind( ptrCf2 ); if ( ( ptrCf2 = fopen( "New_Data.txt", "r+" ) ) == NULL ) { printf( "The file could not be opened\n" ); } //end if
解决方法
首先修正现有代码的错误逻辑:
- 第一次以
w模式打开New_Data.txt写入原始数据后,调用rewind没有实际作用,后续再次调用fopen打开同一个文件会直接覆盖之前的文件指针,还会造成资源泄漏。 - 不需要重复打开文件,写入完原始数据后保持文件打开状态,直接追加写入后续结果即可;如果已经关闭了文件,再次打开时使用
a(追加)模式即可在文件末尾新增内容。
具体实现逻辑:
所有需要打印到控制台的内容,只要在printf输出的同时,同步用fprintf输出到New_Data.txt的文件指针即可,示例修改后的代码如下:
#include <stdio.h> int main() { FILE *ptrCf = fopen("lab1.txt", "r"); FILE *ptrCf2 = fopen("New_Data.txt", "w"); if (ptrCf == NULL || ptrCf2 == NULL) { printf("文件打开失败\n"); return 1; } // 第一步:写入原始数据到New_Data.txt,同时打印到控制台 char data1; printf("=== 原始数据 ===\n"); fprintf(ptrCf2, "=== 原始数据 ===\n"); while ((data1 = fgetc(ptrCf)) != EOF) { putchar(data1); // 输出到控制台 fputc(data1, ptrCf2); // 写入到文件 } // 第二步:写入a模块结果 printf("\n=== a) 获得毕业证的人员 ===\n"); fprintf(ptrCf2, "\n=== a) 获得毕业证的人员 ===\n"); // 这里替换成你自己a模块的输出逻辑 // 示例:printf("JOAN 70.5 85\n"); 对应加一句 fprintf(ptrCf2, "JOAN 70.5 85\n"); // 第三步:写入b模块结果 printf("\n=== b) 科目A成绩升序排序结果 ===\n"); fprintf(ptrCf2, "\n=== b) 科目A成绩升序排序结果 ===\n"); // 替换成你自己b模块的输出逻辑,同上同步printf和fprintf // 第四步:写入c模块结果 printf("\n=== c) 科目平均分与标准差 ===\n"); fprintf(ptrCf2, "\n=== c) 科目平均分与标准差 ===\n"); // 替换成你自己c模块的输出逻辑,同上同步printf和fprintf // 最后关闭所有文件 fclose(ptrCf); fclose(ptrCf2); return 0; }
如果已经提前关闭了写入原始数据的文件指针,再次打开时用以下代码即可在文件末尾追加内容:
ptrCf2 = fopen("New_Data.txt", "a");
模式a会自动将写入位置定位到文件末尾,不会覆盖之前已经写入的原始数据。
内容的提问来源于stack exchange,提问作者Nisleidy Santiago
相关产品推荐
相关产品推荐

