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

C语言读取txt到二维数组循环打印末尾行值错误问题排查

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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:48:02