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

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;
}

关键修正说明

  1. 替换feof循环:用while (fgets(row, CHAR, st) != NULL)直接判断读取是否成功,避免无效循环。
  2. 维护当前位置变量:用current_row记录当前处理的行,current_col记录当前行的列位置,每处理一个token就移动current_col,一行处理完后移动current_row。
  3. 处理换行符:读取行后检查并移除末尾的换行符,避免最后一个token带多余的换行。
  4. 边界检查:添加current_row < ROWS和current_col < COLS的判断,防止数组越界写入。
  5. 移除错误的嵌套for循环:不再每次覆盖整个数组,而是只写入当前对应的位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:42:53