我从csv文件读取数据并将其保存到数组时遇到问题。我想在功能上做到这一点。值在功能上很好(读取效果很好),但主值却不然。我认为这是重新分配过程中的指针的问题(我可能会丢失其中的一些)。这是我的代码,请帮助。
void read_from_csv(FILE* file ,double **tab, int *size)
{
int i = 0;
double A, B;
double *temp;
while (fscanf(file, "%lf;%lf\n", &A, &B) != EOF)
{
i += 2;
temp = realloc(*tab, i*sizeof(**tab));
if (temp != NULL)
{
*tab = temp;
*size = i;
**(tab + i - 2) = A;
**(tab + i - 1) = B;
}
else
{
printf("\nERROR");
temp = NULL;
}
}
}
我在主体中这样称呼它:
file = fopen("file.csv", "r");
read_from_csv(file,&tab,&size);
fclose(file);
tab在main之前分配为
double *tab;
tab = malloc(1*sizeof(*tab));
答案 0 :(得分:0)
double *tab;
tab = malloc(1*sizeof(*tab));
temp = realloc(*tab, i*sizeof(**tab));
这些为指针分配空间,但是您存储的是通常较大的double。所以你需要...
tab = malloc(1*sizeof(*tab));
temp = realloc(*tab, i * sizeof(double));
**(tab + i - 2) = A;
**(tab + i - 1) = B;
这也不完全正确。它会添加到指向指针的tab
地址中,然后在只有一个指针空间的地方尝试将杆2加倍。
相反,您想将分配的内存地址添加到*tab
中,然后取消引用。
*(*tab + i - 2) = A;
*(*tab + i - 1) = B;
将*tab
用作数组可以做同样的事情,而且更容易阅读。
(*tab)[i - 2] = A;
(*tab)[i - 1] = B;
while (fscanf(file, "%lf;%lf\n", &A, &B) != EOF)
这也不完全正确。如果总是看到正确的输入,就可以了。但是,如果看到某些东西,它不会挂起。如果fscanf
解析失败,则光标不会前进。它将一遍又一遍地重复读取相同的坏行。 A
和B
中的所有垃圾都会进入tab
。这是scanf
and fscanf
的众多问题之一。
相反,使用fgets
和sscanf
分别从读取和解析行中读取。这样可以避免垃圾数据,并可以更好地处理不良行。
char line[BUFSIZ];
while (fgets(line, sizeof(line), file) != NULL)
{
if( sscanf(line, "%lf;%lf\n", &A, &B) != 2 ) {
fprintf(stderr, "%s could not be parsed\n", line);
continue;
}
...
}