У меня есть файл, который содержит data.csv
float
типа данных:fgets не читает полную строку в C
0.22,0.33,0.44
0.222,0.333,0.444
Мне нужно прочитать этот файл в двухмерном динамическом массиве. Но я не могу прочитать полную строку с fgets
. Не знаете почему?
Вот мой C код, который я использовал на Ubuntu:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
FILE *fp;
float **data;
int i,j,rows=2,cols=3;
char * token;
fp=fopen("data.csv","r");
if(fp==NULL) {
fprintf(stderr,"Can't open input file");
exit(1);
}
data= malloc(rows * sizeof(float*));
char *rowbuffer=malloc(cols * (sizeof(float)+sizeof(char)));
i=0;
while(fgets(rowbuffer,sizeof(rowbuffer),fp) !=NULL) {
data[i] = malloc(cols * sizeof(float));
j=0;
printf("\n %s",rowbuffer);
for (token = strtok(rowbuffer,","); token != NULL; token = strtok(NULL, ",")) {
data[i][j++] = atof(token);
/*printf("%s",token);*/
}
i++;
}
free(rowbuffer);
for(i = 0; i < rows; i++)
free(data[i]);
free(data);
fclose(fp);
}
Выход как:
0.22,0.
33,0.44
0.222,0
Ошибка в `./test ': двойной бесплатно или повреждение (уходит): 0x0000000000adf270
Прерывание (сбрасывание ядра)
Может кто-нибудь сказать, почему эта ошибка? :( Или есть лучший способ, чтобы прочитать этот тип файла данных
'sizeof (rowbuffer) == sizeof (char *)' ... это, скорее всего, 4 или 8, в зависимости от аппаратного обеспечения. Поскольку вы * предполагаете *, это размер выделенного буфера, ваши предположения ошибочны. – DevSolar
Возможный дубликат [Как найти «sizeof» (указатель, указывающий на массив)?] (Http://stackoverflow.com/questions/492384/how-to-find-the-sizeofa-pointer-pointingtoto -an-array) –
Кроме того, отступы. Пробелы свободны. ;-) – DevSolar