在C中将CSV转换为2D数组

时间:2012-10-02 16:13:48

标签: c

这对我来说是一个非常迷人的错误,因为从字面上讲,一小时前这段代码工作正常,但现在却没有。

基本上发生的事情是,下一行的第一个“块”的第一个字符被追加为最后一个“块”的最后一个字符

Whereby'block'我的意思是该行/ col中的字符串。

例如,假设数组应该是

1,2,3,Hello
4,5,6,Wonder

正在阅读

1,2,3,Hello4,
6,Wonder, , 

这是我一直在使用的逻辑。我真的不知道发生了什么变化,所以任何建议都会很棒。

tableFile = fopen(argv[4], "r");


//pulling the table data from the file
char tableArray[30][50][256];
char c;
int i=0, j=0, k=0;
while(c != EOF){

    c = fgetc(tableFile);

    switch(c)
    {
        case ',':
            tableArray[i][j++][k]='\0';
            k=0;
            break;
        case '\n':
            tableArray[i++][j][k]='\0';
            j=0;
            k=0;
            break;
        case '\r':
            break;
        case EOF:
            break;
        default:
            tableArray[i][j][k++] = c;
            break;
    }

} //end file transfer

//Just to display, ignore magic numbers as (mostly) irrelevant
int a, b;

for (a = 0; a < 20; a++)
{
    for (b = 0; b < 47; b++)
    {
        printf ("%s", tableArray[a][b]);
        if (b<46)
            printf (", ");

    }
    printf ("\n");
}

fclose(tableFile);

2 个答案:

答案 0 :(得分:1)

  1. 您没有初始化数组。不能保证零填充。添加

    memset(tableArray, 0, sizeof(tableArray))

  2. case EOF:必须在最近的字符串中添加NULL终止符。

答案 1 :(得分:0)

这真的是由于我原来的帖子下面的评论。但是,正如令人作呕和糟糕的编码形式一样......这就是一贯解决它的问题,而不是我为它感到骄傲......并且仍然对这些想法持开放态度:

tableFile = fopen(argv[4], "r");

//pulling the table data from the file, lazy magic numbers here... 
char tableArray[30][50][256];
char c;
int i=0, j=0, k=0;

memset(tableArray, 0, sizeof(tableArray));
while(c != EOF){

    c = fgetc(tableFile);

    switch(c)
    {
        case ',':
            tableArray[i][j++][k]='\0';
            k=0;
            break;
        case '\n':
            tableArray[i++][j][k]='\0';
            j=0;
            k=0;
            break;
        case '\r':
            tableArray[i++][j][k]='\0';
            j=0;
            k=0;
            break;
        case EOF:
            tableArray[i][j][k] = '\0';
            break;
        default:
            tableArray[i][j][k++] = c;
            break;
    }

} //end file transfer

/* //Only relevant for displaying the tableArray
int a, b;

for (a = 0; a < 20; a++)
{
    for (b = 0; b < 47; b++)
    {
        printf ("%s", tableArray[a][b]);
        if (b<46)
            printf (", ");

    }
    printf ("\n");
}
 */

fclose(tableFile);