我试图用C语言将一个包含整数的.csv文件解析成一个二维数组,但我的程序无法运行,我不确定原因.

2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2

(上面包含的是我试图解析的.csv文件,它只是1和2的整数.)

我的程序:

#include <stdio.h>
#define ROWS 12
#define COLUMNS 12

int main () {

int array [LEVEL_ROWS] [LEVEL_COLUMNS];

FILE *file;

file = fopen("data.csv","r");

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

for (int i = 0; i < COLUMNS; i++)
{
    for(int j = 0; j < ROWS; j++)
    {
        if(fscanf(file,"%d,",&array[i][j] )!=1)
        {
            fprintf(stderr,"error reading from file\n");
            fclose(file);
            return 1;
        }
    }
}

fclose(file);

for(int i = 0; i < COLUMNS; i++)
{
    for (int j =0; j < ROWS; j++)
    {
        printf("%d ", array[i][j]);
    }
    printf("\n");
}

return 0;

}

但是,我的程序打印的.csv文件的内容完全错误,我找不出原因

打印输出(与.csv文件的实际内容不同):

2 2 2 2 2 2 2 2 2 2 2 
2 2 2 2 2 2 2 2 2 2 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 2 2 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 2 2 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
1 1 2 2 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1
2 2 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 2 2

对于哪里出了问题,有什么帮助和解释吗?谢谢!

推荐答案

  • #define COLUMNS 12与文件中的列数不匹配.文件中有20列.
  • LEVEL_ROWSLEVEL_COLUMNS根本没有定义.
  • 如果你想利用C中固有的row-major order存储,不要将列值读入数组的自然行范围.您已经定义了数组int array [LEVEL_ROWS][LEVEL_COLUMNS];,但是您将列值读入行,反之亦然.
  • 最后一行末尾的"缺失",现在不是问题,但它看起来未完成.最好保持一致.我会删除每一行中的最后一个逗号(或者可能在所有行中添加一个逗号).

如果您随后将COLUMNS定义为20,并交换行和列读取(以及打印),它将工作得很好.示例:

#include <stdio.h>

#define ROWS (12)
#define COLUMNS (20)

int main(void) {
    const char* filename = "data.csv";

    FILE* file = fopen(filename, "r");

    if(file == NULL) {
        perror(filename);
        return 1;
    }

    int array[ROWS][COLUMNS];

    for(int row = 0; row < ROWS; row++) {
        for(int col = 0; col < COLUMNS; col++) {
            if(fscanf(file, "%d,", &array[row][col]) != 1) {
                fprintf(stderr, "error reading from file\n");
                fclose(file);
                return 1;
            }
        }
    }
    fclose(file);

    for(int row = 0; row < ROWS; row++) {
        for(int col = 0; col < COLUMNS; col++) {
            printf("%d ", array[row][col]);
        }
        putchar('\n');
    }
}

C++相关问答推荐

理解没有返回语句的递归C函数的行为

为什么getchar()挂起了,尽管poll()返回了一个好的值?""

返回一个包含数组的 struct

Tiva TM4C123GXL的I2C通信

为什么在4.9.37版的内核中,kfio还需要smp_wmb呢?

C编译器是否遵循restrict的正式定义?

正在try 将文件/文件夹名从目录 struct 存储到链接列表

非正规化边缘毛刺

在WSL关闭/重新启动后,是什么原因导致共享对象依赖关系发生更改?

==284==错误:AddressSaniizer:堆栈缓冲区下溢

Boyer Moore算法的简单版本中的未定义行为

类型定义 struct 与简单的类型定义 struct

如何将大写/小写土耳其字母相互转换?

Linux分段故障(核心转储)

如何在C中用bool进行文件I/O?

为什么我无法访问C语言中的文件

try 查找带有指针的数组的最小值和最大值

如何在C中处理流水线中的a、n命令?

Makefile无法将代码刷新到ATmega328p

我可以使用Windows SDK';s IN6_IS_ADDR_LOOPBACK等,尽管没有文档?