2014-12-04 61 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

相關問題