我有一个文件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
Aborted(核心转储)
任何人都可以告诉为什么这个错误? :( 还是有更好的方式来读取这种数据文件的
'sizeof(rowbuffer)== sizeof(char *)'...这可能是4或8,具体取决于硬件。由于您假设*这是分配缓冲区的大小,因此您的假设是错误的。 – DevSolar 2015-02-12 08:48:00
可能重复的[如何找到'sizeof'(指向数组的指针)?](http://stackoverflow.com/questions/492384/how-to-find-the-sizeofa-pointer-pointing-to -an-array) – 2015-02-12 08:48:24
另外,缩进。空白空间是免费的。 ;-) – DevSolar 2015-02-12 08:53:48