C语言读取CSV文件到字符串二维数组时出现异常问题
问题分析与解决
核心错误点
- 错误的数组赋值逻辑:每次拿到token后,你用两层for循环把整个
data数组的所有元素都拷贝成当前token,这意味着每一个新token都会覆盖之前所有的数组元素,最终整个数组自然全是最后一个token的值。 - 未维护当前写入位置:没有用变量跟踪当前应该写入的行和列,而是每次都从头遍历整个数组,完全违背了“逐行逐列填充”的逻辑。
- feof的误用:
while (!feof(st))的写法会导致最后一次fgets读取失败后,仍然进入循环处理无效的row数据,产生垃圾内容。 - 未处理换行符:
fgets会把换行符\n也读入row中,导致最后一个token可能带有换行符,需要提前处理。
修正后的代码示例
#include <stdio.h> #include <string.h> #define ROWS 100 // 替换成你的实际行数 #define COLS 10 // 替换成你的实际列数 #define CHAR 1024 // 每行最大字符数 int main() { FILE *st = fopen("data.csv", "r"); if (!st) { perror("Failed to open file"); return 1; } char data[ROWS][COLS][CHAR]; // 假设每个元素最多CHAR个字符 char row[CHAR]; char *token; int current_row = 0; // 正确的文件读取循环:先读再判断是否成功 while (fgets(row, CHAR, st) != NULL) { // 去掉行尾的换行符(如果存在) size_t len = strlen(row); if (len > 0 && row[len-1] == '\n') { row[len-1] = '\0'; } token = strtok(row, ","); int current_col = 0; while (token != NULL && current_row < ROWS) { // 确保不超过列数上限 if (current_col < COLS) { strcpy(data[current_row][current_col], token); current_col++; } token = strtok(NULL, ","); } current_row++; } fclose(st); // 测试打印数组 for (int i = 0; i < current_row; i++) { for (int j = 0; j < COLS; j++) { printf("%s ", data[i][j]); } printf("\n"); } return 0; }
关键修正说明
- 替换feof循环:用
while (fgets(row, CHAR, st) != NULL)直接判断读取是否成功,避免无效循环。 - 维护当前位置变量:用
current_row记录当前处理的行,current_col记录当前行的列位置,每处理一个token就移动current_col,一行处理完后移动current_row。 - 处理换行符:读取行后检查并移除末尾的换行符,避免最后一个token带多余的换行。
- 边界检查:添加
current_row < ROWS和current_col < COLS的判断,防止数组越界写入。 - 移除错误的嵌套for循环:不再每次覆盖整个数组,而是只写入当前对应的位置。
内容的提问来源于stack exchange,提问作者Jacob Mohamed
相关产品推荐
相关产品推荐

