2014-12-04 39 views
1

因此,我正在读取由逗号分隔的文件中的值,并将其分配给一维双精度数组。下面是我使用做到这一点的方法:将文本文件输入分配给双精度数组

double* readFile(char *fileName) 
{ 
FILE *fp = fopen(fileName, "r"); 
char *token; 
int i = 0; 
int j = 0; 

double *retval = (double *)malloc(5000 * sizeof(double)); 
if(fp != NULL) 
{ 
    char line[10]; 
    while(fgets(line, sizeof line, fp) != NULL) 
    { 
     //printf("Parsed line: %s\n", line); 
     token = strtok(line, ",");   
     while(token != NULL) 
     { 
      printf("token: %s\n", token); 
      *retval = atof(token); 
      printf("value: %d\n",*retval); 
      retval++; 
      token=strtok(NULL,","); 
     } 
    } 
    fclose(fp); 
} else { 
    perror(fileName); 
} 

for(j = 0; j < i; j++) 
{ 
    retval--; 
} 

return retval;  
} 

我得到的问题是,在我指定ATOF()标记化值,这是正确的,即保存在价值指针是绝对不正确的。例如,我有一个文本文件,它只是全部为零,并且在数组中保存的是在每个位置上的-1587604999这样的疯狂值。

任何人都看到问题了吗?

回答

1

您正在使用%d格式说明符为double。你应该尝试%f

+0

就是这样!好样的! – 2014-12-04 01:44:05

1

retval已经推进,现在指向下一个可用位置。

你想保存原始的malloc值并返回。

也可能有其他问题,例如,调用者如何知道值的结尾?另外,如果您获得超过5000个值,该怎么办?此外,错误的空闲内存。但我认为这只是你的测试代码,你最终会解决这些问题。

+0

这是一些测试代码,但这些都是非常重要的事情。调用者将按照与我现在使用此方法相同的方式在内存中前进。这应该工作,对吗? – 2014-12-04 01:45:02

+0

不是用'retval'提前完成当前的工作。你想返回给调用者的是数组的头部而不是尾部。 – Dinesh 2014-12-04 01:48:52

+0

我刚刚添加了一些应该解决的问题,有没有更聪明的方法,还是这样就足够了? – 2014-12-04 02:03:11

相关问题