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

