2015-08-28 3 views
0

Я прочитал из CSV-файла с 4 столбцами (целыми числами). Функция чтения работает, но когда я пытаюсь вставить полукокс значения в массив (целые числа) возвращает эту ошибкуconvert const char * to int

значение типа «Const символ *» не может быть назначен объектом типа «поплавка»

Я стараюсь использовать atoi, но возвратный список 0000, 1111 и т. Д. Можете ли вы предложить мне какое-то решение? код:

const char* getfield(char* line, int num) 
{ 
    const char* tok; 
    for (tok = strtok(line, ","); 
      tok && *tok; 
      tok = strtok(NULL, ";\n")) 
    { 
     if (!--num) 
      return (tok); 
    } 
    return NULL; 
} 


int main(void) 
{ 

    FILE *pf=fopen("Trajectory_1.csv","r");   
    char line[1024]; 

    if(pf==NULL){ 
     printf("ERROR MESSAGE"); 
     exit(1); 
    } 
    int x=0; 
    while(fgets(line,sizeof(line),pf)){ 
     char* tmp=strdup(line); 
     printf("%s",getfield(tmp,1)); 
     t_h[x]=getfield(tmp,1); 
     free(tmp); 
     x++; 
    } 
    fclose(pf); 
} 

в этом случае только первый столбец

РЕДАКТИРОВАТЬ код будет

double getfield(char* line, int num) 
{ 
    const char* tok; 
    for (tok = strtok(line, ","); //comam separator 
      tok && *tok; 
      tok = strtok(NULL, ";\n")) 
    { 
     if (!--num) 
      return (atof(tok)); 
    } 
    return NULL; 
} 

FILE *pf=fopen("//home//user//Documenti//Bello//Dataset1//Trajectories//Trajectory_1.csv","r"); //rivedere 
    char line[1024]; 

    if(pf==NULL){ 
     printf("ERR MSG"); // I change this like William suggest 
     exit(1); 
    } 

int x=0; 

    while(fgets(line,sizeof(line),pf)){ 

     double d=getfield(line,1)); // I did not understand 

    } 
    fclose(pf); 
+0

'printf (" ERROR MESSAGE ");' всегда неправильно. Ошибки принадлежат stderr. Попробуйте 'pf = open (путь," r "); if (pf == NULL) {perror (путь); ... ' –

+0

@WilliamPursell« Сообщение об ошибке »только для этого вопроса, у меня есть соответствующее сообщение –

+0

Конечно, но вы печатаете его в неправильном потоке. –

ответ

0

getField, чтобы вернуть значение с плавающей запятой столбца CSV идентифицирован от num. getField вызывается каждый раз с новой строкой для разбора.

Затем функция должна вернуть двойной, а именно return(atof(tok)); (и будет объявлен как double getfield(..);

Вы должны удалить инструкцию печати, поскольку она вызывает getField, но getField изменяет строку (через strtok). Также нет необходимости звонить strdup; просто позвольте getField работать на line.

Примечание: Я не специалист по strtok, но второй вызов (в инструкции for) может быть неправильным и может также нуждаться в запятой в качестве терминатора.