gpt4 book ai didi

c - 在 C 中将 .csv 解析为 3d 数组

转载 作者:行者123 更新时间:2023-11-30 17:05:32 25 4
gpt4 key购买 nike

我正在尝试编写一个程序来排列给定 CSV 的列。我的目标是将 CSV 解析为 3D 字符数组,转置它,排列它,转置回来,写入输出文件

我对函数getRows()有疑问。每次我递增到下一行时,似乎第一行被覆盖。我已经发布了整个事情,因为我不太可能在早期阶段就搞砸了,这就是导致问题的原因(如果我做了一些非常愚蠢的事情,请原谅我,我是 C 新手)

#include <stdio.h>
#include <stdlib.h>

#define MAXLEN 10

char*** getRows(FILE *file, char*** rows);
char*** createArray(int size);

/* Fucntion to read a csv and output the rows permuted */
int main()
{
char*** rows;
FILE *fp;

fp = fopen("text.csv", "r");
if(fp == NULL)
{
printf("Didn't open\n");
return -1;
}
rows = createArray(MAXLEN);
rows = getRows(fp, rows);
fclose(fp);

return 0;
}

/* Initializes Array */
char*** createArray(int size)
{
char* values = calloc(size*size, sizeof(char));
char** row;
char*** rows = malloc(size*sizeof(char**));
int i, j;
for (i=0; i<size; ++i)
{
row = malloc(size*sizeof(char*));

for(j=0; j<size; ++j)
{
row[j] = values + j*size;
}

rows[i] = row;
}
return rows;
}

/* Poppulates the array with the file data */
char*** getRows(FILE *file, char*** rows)
{
int c;
int i, j, k;

i = j = k = 0;
while((c=fgetc(file)) != EOF)
{
if (c == ' ');
else if (c == ',') /*indicate end of entry and move to next entry in row*/
{
rows[i][j][k] = '\0';
++j;
k = 0;
}
else if (c == '\n') /*indicate end of entry, indicate end of row, move to next row*/
{
rows[i][j][k] = '\0';
rows[i][j+1][0] = '\0';
++i;
j = k = 0;
}
else /* add char to entry */
{
rows[i][j][k] = c;

/* Debugging */
printf("%i\t%i\t%i\t", i, j, k);
putchar(rows[i][j][k]);
printf("\t");
putchar(rows[0][0][0]);
printf("\n");

++k;
}
}
rows[i][j][k] = '\0';
rows[i+1][0][0] = '\0';
return rows;
}

因此调试记录以下内容[i, j, k, rows[i][j][k], rows[0][0][0]]

0       0       0       h       h
0 0 1 e h
0 0 2 a h
0 0 3 d h
0 0 4 e h
0 0 5 r h
0 0 6 1 h
0 1 0 h h
0 1 1 e h
0 1 2 a h
0 1 3 d h
0 1 4 e h
0 1 5 r h
0 1 6 2 h
0 2 0 h h
0 2 1 e h
0 2 2 a h
0 2 3 d h
0 2 4 e h
0 2 5 r h
0 2 6 3 h
1 0 0 1 1
1 1 0 2 1
1 2 0 3 1
2 0 0 4 4
2 1 0 5 4
2 2 0 6 4
3 0 0 7 7
3 1 0 8 7
3 2 0 9 7

我希望一切都清楚了。感谢您的建议!

最佳答案

您的问题出在 Create 中。

rows 指向行数组。每一行都有列,每一列都有一个值(一个值)。

当您将值的地址分配给行的列时,我看到 i 不涉及。这表示您将前几行的地址重复分配给每个row[i][k]

因此,不仅第一行被覆盖,所有行都被覆盖(只有一行值)。

稍后,在 getRows 中,我看到您将 rows 用作 rows[i][j][k]。因此,每个 row[i][j] 都有 size 值。然后是 size*size*size 值(您只分配 size*size):

char*** createArray(int size)
{
char* values = calloc(size*size*size, sizeof(char));
char** row;
char*** rows = malloc(size*sizeof(char**));
int i, j;
for (i=0; i<size; ++i)
{
row = malloc(size*sizeof(char*));

for(j=0; j<size; ++j)
{
row[j] = values + i*size*size + j*size;
}
rows[i] = row;
}
return rows;
}

关于c - 在 C 中将 .csv 解析为 3d 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35244576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com