如何从文本文件读取全部数字存入数组?排查读取异常及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; }
代码说明
- 参数检查:先判断是否传入了正确数量的命令行参数,避免
argv[1]为空导致错误; - 文件打开检查:判断
fopen是否成功,防止文件不存在或权限不足的情况; - 循环读取逻辑:用
fscanf(ptr, "%d", &c[i]) == 1作为循环条件,每次成功读取一个整数才执行i++; - 数组越界保护:加入
i >=40的判断,避免数组溢出(因为你定义的数组只有40个元素)。
内容的提问来源于stack exchange,提问作者Miko 65
相关产品推荐
相关产品推荐

