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
相关产品推荐
相关产品推荐

