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

如何从文本文件读取全部数字存入数组?排查读取异常及EOF判断

问题分析与解决方案

首先得指出你当前代码的核心问题:你用c[i]!=-1作为循环终止条件,但你的输入文件里根本没有-1这个值,而且每次执行fscanf后i立刻自增,此时c[i]是未初始化的内存值(随机垃圾值),刚好前三次读取后这个随机值碰巧等于-1,导致循环提前终止,这就是为什么只读到前3个数字。

如何判断文件EOF?

对于fscanf这类格式化输入函数,判断是否到达文件末尾(EOF)的正确方式是检查它的返回值:

  • fscanf会返回成功读取并赋值的变量个数,比如你用%d读取一个整数,成功的话返回1;
  • 如果到达文件末尾(EOF)或者读取失败(比如遇到非数字字符),它会返回EOF(一个宏,通常定义为-1)。

修改后的代码

下面是修正后的代码,能正确读取文件里所有整数:

#include <stdio.h>

int main(int argc, char *argv[]) {
    int c[40];
    int i = 0;
    FILE *ptr;

    // 先检查参数是否正确传入
    if (argc != 2) {
        printf("请传入正确的文件路径作为参数!\n");
        return 1;
    }

    ptr = fopen(argv[1], "r");
    // 检查文件是否成功打开
    if (ptr == NULL) {
        printf("无法打开文件!\n");
        return 1;
    }

    // 循环读取,直到fscanf返回EOF(到达文件末尾)
    while (fscanf(ptr, "%d", &c[i]) == 1) {
        i++;
        // 防止数组越界,因为数组只有40个元素
        if (i >= 40) {
            printf("数组空间不足,已停止读取!\n");
            break;
        }
    }

    // 输出所有读取到的数字
    for (int k = 0; k < i; k++) {
        printf("%d ", c[k]);
    }
    printf("\n");

    fclose(ptr);
    return 0;
}

代码说明

  1. 参数检查:先判断是否传入了正确数量的命令行参数,避免argv[1]为空导致错误;
  2. 文件打开检查:判断fopen是否成功,防止文件不存在或权限不足的情况;
  3. 循环读取逻辑:用fscanf(ptr, "%d", &c[i]) == 1作为循环条件,每次成功读取一个整数才执行i++;
  4. 数组越界保护:加入i >=40的判断,避免数组溢出(因为你定义的数组只有40个元素)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:23:50