2014-12-04 2 views
1

Так что я читаю значения из файла, разделенного запятой, и назначая его 1D массиву парных чисел. Вот метод я использую для достижения этой цели:Назначение ввода текстового файла в массив парных разрядов

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 для двойного. Вы должны попробовать %f.

+0

Это было! Браво! –

1

retval имеет продвинутый код и теперь указывает на следующее полезное место.

Вы хотите сохранить исходное значение malloc и вернуть его.

Могут быть и другие проблемы, например, как вызывающий абонент знает, где заканчиваются значения? Кроме того, что, если вы получаете более 5000 значений? Кроме того, свободная память при ошибке. Но я предполагаю, что это всего лишь ваш тестовый код, и вы в конечном итоге будете решать эти проблемы.

+0

Это какой-то тестовый код, но это важные вещи, которые нужно учитывать, тем не менее. Вызывающий будет продвигаться через местоположение в памяти так же, как и сейчас, в этом методе. Это должно работать, правильно? –

+0

Не с 'retval' продвигается так, как это делается в настоящее время. То, что вы хотите вернуть вызывающему, - это голова массива, а не хвост. – Dinesh

+0

Я только что добавил что-то, что должно исправить это, есть ли более умный способ или это будет достаточно? –

Смежные вопросы