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

C语言解析整数CSV到二维数组出错,求排查原因

问题分析与修正:CSV解析为C二维数组错误

核心问题梳理

  • 宏定义与数组维度不匹配:你定义了ROWS 12和COLUMNS 12,但数组声明用了未定义的LEVEL_ROWS和LEVEL_COLUMNS,属于编译错误;更关键的是CSV文件每行有20个元素、共12行,程序里的行列维度完全和文件不匹配,导致读取数据严重错位。
  • 循环逻辑颠倒:读取和输出时都把行列循环搞反了——文件按行存储(每行对应数组一行),但你外层循环遍历列数、内层遍历行数,相当于转置了数组,同时因为维度不足截断大量数据。
  • fscanf格式字符串缺陷:用"%d,"读取时,每行最后一个元素后无逗号,会导致fscanf匹配失败,后续读取逻辑混乱;换行符也会干扰读取流程。
  • 数组越界:程序仅读取12*12=144个元素,但CSV文件有12*20=240个元素,越界读取会导致内存数据混乱,输出结果自然错误。

修正后的代码

#include <stdio.h>
#define ROWS 12
#define COLUMNS 20  // 匹配CSV文件的实际列数

int main () {
    int array[ROWS][COLUMNS];  // 行在前、列在后,对应文件存储逻辑
    FILE *file = fopen("data.csv", "r");

    if (file == NULL) {
        printf("error opening file");
        return 1;
    }

    // 按行读取:外层遍历行,内层遍历列
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLUMNS; j++) {
            // 先读取整数,再处理后续的分隔符
            if (fscanf(file, "%d", &array[i][j]) != 1) {
                fprintf(stderr, "error reading from file\n");
                fclose(file);
                return 1;
            }
            // 跳过逗号或换行符(兼容每行最后一个元素后的换行)
            fscanf(file, ",\n");
        }
    }

    fclose(file);

    // 按行输出,与读取逻辑一致
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLUMNS; j++) {
            printf("%d ", array[i][j]);
        }
        printf("\n");
    }

    return 0;
}

关键修正点说明

  • 调整数组维度为ROWS=12、COLUMNS=20,完全匹配CSV文件的行数列数;
  • 颠倒循环顺序,外层处理行、内层处理列,和文件的存储结构对齐;
  • 修改读取逻辑:先读整数,再跳过逗号或换行,解决最后一列无逗号导致的匹配失败问题;
  • 输出逻辑和读取逻辑保持一致,确保输出结果与原CSV文件内容完全对应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:32:50