C语言读取txt到二维数组循环打印末尾行值错误问题排查
问题根因
- 行数统计逻辑错误:
feof是读取操作失败触发EOF标记后才会返回真,你用该逻辑统计换行后额外对numLines加1的操作会导致行数多算1,同时输出循环的上限设为numLines + 1,相当于多遍历了一行从未初始化的栈内存区域,读取到的是栈上的随机垃圾值。 - 列数计算错误:你统计第一行的空格数作为数组第二维长度,而5个数字的行只有4个空格,会导致数组列数比实际需要少1,写入数据时发生数组越界,越界写入会覆盖后续行的数组存储内容,导致后面几行数据异常。
- 数据读取逻辑错误:先调用
fgetc读取一个字符后,再调用fscanf读整数会丢失当前数字的首字符,且你未判断fscanf的返回值,读到文件末尾读取失败时不会对数组元素赋值,元素默认保留栈上的随机值。 - 变长数组未初始化:你定义的栈边长数组
array[numLines + 1][space]不会自动初始化,未写入数据的位置默认是随机垃圾值。
修复方案
- 修正行数统计逻辑:
int ch; numLines = 0; while ((ch = fgetc(outputFile)) != EOF) { if (ch == '\n') numLines++; } // 若文件最后一行无换行符,补充计数1行 if (ftell(outputFile) > 0 && ch != '\n') numLines++; // 移除多余的numLines +=1 操作
- 修正列数计算逻辑,空格数+1才是每行的数字个数:
int colNum; space = 0; do { ch = fgetc(outputFile); if (ch == ' ') space++; } while(ch != '\n' && ch != EOF); colNum = space + 1;
- 简化读取逻辑,
fscanf本身会自动跳过空格、换行等空白符,不需要提前用fgetc判断:
int array[numLines][colNum]; for(i = 0; i < numLines; i++){ for(j = 0; j < colNum; j++){ // 判断读取是否成功,失败则赋值为0避免垃圾值 if (fscanf(outputFile, "%d", &array[i][j]) != 1) { array[i][j] = 0; } } }
- 修正输出循环上限,只遍历实际存在的行:
for(i = 0; i < numLines; i++){ // 原有打印、计算逻辑保持不变 }
内容的提问来源于stack exchange,提问作者W4nnaCryy
相关产品推荐
相关产品推荐

