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

C语言技术问询:如何用循环读取文件并计算数值总和与平均值

C语言读取文件数值计算总和与平均值的正确实现

原代码存在的问题

  • 第一个while循环已将文件指针读到末尾(EOF),第二个while循环无法读取任何内容,变量x未被正确赋值,计算平均值会得到错误结果
  • 未处理文件打开失败的情况:若values.txt不存在或无法访问,fin会是NULL,后续操作直接崩溃
  • 冗余逻辑:若仅需计算总和与平均值,无需存储所有数值到数组;即便用数组存储,也未利用数组元素计算总和

方案1:无需数组的高效实现(仅计算总和与平均值)

#include <stdio.h>
#include <math.h> // 若仅计算平均值,此库可省略,保留是为了满足你的要求

int main(void) {
    int count = 0;
    float sum = 0.0f, avg, num;
    FILE *fin = fopen("values.txt", "r");

    // 检查文件是否成功打开
    if (fin == NULL) {
        printf("无法打开文件!\n");
        return 1;
    }

    // 循环读取数值并累加总和
    while (fscanf(fin, "%f", &num) != EOF) {
        sum += num;
        count++;
    }

    fclose(fin); // 用完文件必须关闭,避免资源泄漏

    // 避免除以0的异常情况
    if (count == 0) {
        printf("文件中没有任何数值!\n");
        return 0;
    }

    avg = sum / count;
    printf("读取到的数值个数:%d\n平均值:%f\n", count, avg);

    return 0;
}

方案2:使用数组存储数值(适合需要保留所有数据的场景)

#include <stdio.h>
#include <math.h>
#define MXN 100

int main(void) {
    int count = 0;
    float sum = 0.0f, avg;
    float scores[MXN];
    FILE *fin = fopen("values.txt", "r");

    if (fin == NULL) {
        printf("无法打开文件!\n");
        return 1;
    }

    // 读取数值到数组,同时累加总和(限制数组不越界)
    while (count < MXN && fscanf(fin, "%f", &scores[count]) != EOF) {
        sum += scores[count];
        count++;
    }

    fclose(fin);

    if (count == 0) {
        printf("文件中没有任何数值!\n");
        return 0;
    }

    avg = sum / count;
    printf("数组大小(读取的数值个数):%d\n平均值:%f\n", count, avg);

    return 0;
}

关键要点说明

  • fscanf正确用法:fscanf(fin, "%f", &num) 从文件中读取一个浮点数到num,返回成功读取的参数个数;读到文件末尾时返回EOF
  • 必须检查文件状态:打开文件后一定要判断fin是否为NULL,避免空指针访问错误
  • 防止除以0:若文件为空,count为0,此时不能计算平均值,需做特殊处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:57:38