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

C语言读取文件整数代码死循环及输出异常问题求解

问题排查与修正

现存问题

  • 文件名不匹配:需求指定读取mtData.txt,代码中写的是myInput.txt,会直接导致文件找不到错误。
  • 打印值为地址:printf("%d\n", numbers);中numbers是数组名,C语言中数组名在绝大多数场景下会退化为首元素的内存地址,和Java里直接打印数组对象输出地址哈希的逻辑类似,要打印读取到的整数值,必须指定数组下标访问具体元素。
  • fscanf写入逻辑错误:每次调用fscanf(fp, "%d", numbers)都是把读取到的整数写入数组的第0个位置,会覆盖上一次的读取结果,数组其他位置完全没有被用到。
  • 大括号匹配错误、fclose位置错误:fclose(fp)被写在了while循环的内部,第一次循环执行到一半就会关闭文件指针,后续循环操作的都是已经关闭的无效文件指针,feof判断永远不会触发,直接导致无限循环。
  • 未按需求逻辑读取:需求明确说明文件第一个数值是后续待读取的数值数量,当前代码完全没有用到这个规则,也没有限制读取总数不超过100。
  • feof使用逻辑错误:feof是在读取操作已经触发了EOF之后才会返回真,正确的判断逻辑应该先判断fscanf的返回值是否为预期的读取项数,再判断是否到达文件末尾。

修正后完整代码

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int main(){
    FILE *fp = NULL;
    int readCount = 0;
    int totalNum = 0;
    int numbers[100] = {0};

    // 按需求打开指定文件
    fp = fopen("mtData.txt", "r");
    if(fp == NULL){
        puts("Error accessing file");
        return -1;
    }

    // 先读取第一个值:后续待读取的数值数量
    if(fscanf(fp, "%d", &totalNum) != 1){
        puts("Failed to read number count");
        fclose(fp);
        return -1;
    }
    // 限制总数不超过100
    if(totalNum > 100 || totalNum < 0){
        puts("Number count is out of valid range (0~100)");
        fclose(fp);
        return -1;
    }

    // 循环读取指定数量的整数
    for(readCount = 0; readCount < totalNum; readCount++){
        if(fscanf(fp, "%d", &numbers[readCount]) != 1){
            printf("Only read %d numbers, expected %d\n", readCount, totalNum);
            break;
        }
        // 打印读取到的数值
        printf("Read number %d: %d\n", readCount+1, numbers[readCount]);
    }

    // 所有文件操作结束后再关闭指针
    fclose(fp);
    return 0;
}

关键修改说明

  • 把fclose移到所有文件读写操作结束之后,避免提前关闭文件指针。
  • 先读取文件第一个数值作为待读取总数,同时添加了数值范围校验,避免数组越界。
  • 每次fscanf写入数组的对应下标位置,不会覆盖之前的读取结果。
  • 直接通过totalNum控制循环次数,不需要额外的标记变量,逻辑更清晰,也避免了feof的错误使用问题。
  • 打印的时候指定数组下标读取具体的整数值,不会输出地址。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:06:02