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

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;
}

优化点说明

  1. 去掉了数组,边读取数字边统计,彻底避免数组溢出问题;
  2. 增加了文件打开失败的判断,程序更健壮;
  3. 处理了文件为空或无有效数字的情况,不会出现未初始化变量的问题;
  4. 用fscanf(...) == 1判断是否成功读取整数,比!= EOF更准确——如果遇到非数字字符,fscanf会返回0,这时候也会终止循环,避免死循环。

内容的提问来源于stack exchange,提问作者Музаффар Шакаров

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:47:25