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

