C语言读取file.txt统计数字总数及最大值代码无法在Code::Blocks运行求助
问题排查与代码修正:统计文本文件中的数字总数和最大值
我帮你梳理下代码里的问题,这些就是导致程序在Code::Blocks里无法正常执行的原因:
fscanf的判断逻辑完全写错了
你写的while(fscanf(in,"%d",&arr[i] != EOF))把判断位置搞反了!!= EOF是用来判断fscanf的返回值的,正确写法应该是while(fscanf(in,"%d",&arr[i]) != EOF)——必须把!= EOF放在fscanf的括号外面,这样才能判断是否成功读取到数字。max的初始化搞反了
arr[0]=max;这行是把未初始化的max值塞给数组第一个元素,完全颠倒了逻辑!正确的应该是max = arr[0];,把第一个读取到的数字作为最大值的初始值。而且如果文件里没有数字,这行还会引发未定义行为。数组有溢出风险
你定义了int arr[100],但如果file.txt里的数字超过100个,就会触发数组越界,直接导致程序崩溃。其实咱们根本不需要存所有数字,边读边统计总数和最大值就够了,既省内存又安全。没判断文件是否成功打开
如果file.txt不存在、路径错了或者没读取权限,fopen会返回NULL,这时候直接往下执行代码会导致程序崩溃,必须先做判断。
修正后的优化代码
#include <stdio.h> #include <stdlib.h> int main() { FILE *in = fopen("file.txt", "r"); // 先检查文件是否成功打开 if (in == NULL) { printf("无法打开file.txt文件!\n"); return EXIT_FAILURE; } int num; int count = 0; int max; // 先读取第一个数字,初始化统计变量 if (fscanf(in, "%d", &num) == 1) { count = 1; max = num; // 继续读取剩余数字,边读边更新总数和最大值 while (fscanf(in, "%d", &num) == 1) { count++; if (num > max) { max = num; } } printf("数字总数: %d\n最大值: %d\n", count, max); } else { printf("file.txt中没有有效数字!\n"); } fclose(in); // 记得关闭文件,养成好习惯 return EXIT_SUCCESS; }
优化点说明
- 去掉了数组,边读取数字边统计,彻底避免数组溢出问题;
- 增加了文件打开失败的判断,程序更健壮;
- 处理了文件为空或无有效数字的情况,不会出现未初始化变量的问题;
- 用
fscanf(...) == 1判断是否成功读取整数,比!= EOF更准确——如果遇到非数字字符,fscanf会返回0,这时候也会终止循环,避免死循环。
内容的提问来源于stack exchange,提问作者Музаффар Шакаров
相关产品推荐
相关产品推荐

