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

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
解决方法

首先修正现有代码的错误逻辑:

  1. 第一次以w模式打开New_Data.txt写入原始数据后,调用rewind没有实际作用,后续再次调用fopen打开同一个文件会直接覆盖之前的文件指针,还会造成资源泄漏。
  2. 不需要重复打开文件,写入完原始数据后保持文件打开状态,直接追加写入后续结果即可;如果已经关闭了文件,再次打开时使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:57:05