2013-04-26 1 views
1

Я закодировал функцию для чтения в CSV-файле, но на полпути через разбор программных сбоев, дающих мне ошибки в strcat. Ошибки находятся в третьем поле, которое является телефоном. Я могу «Я заметил ошибку, которую я совершил в этой функции чтения. У меня есть идея, где я иду сюда?функция сбоев при чтении в файле csv

struct contact *readFile(struct contact *ptrList) 
{ 
    struct contact *head, *newContact; 
    FILE *fptr; 
    char oneLine[CONTACT_MAX]; 
    char *sn, *fn, *ph, *co; 
    head = ptrList; 


    //open test.csv to be read 
    fptr = fopen("test.csv", "r"); 

    if(fptr == NULL) 
    { 
     printf("\nCouldn't open %s..."); 
     return(ptrList); 
    } 
    fgets(oneLine, CONTACT_MAX, fptr); 

    while(!feof(fptr)) 
    { 
     fgets(oneLine, CONTACT_MAX, fptr); // process the next line to be tokenized 
     if (oneLine[strlen(oneLine) - 1] == '\n') 
     { 
      oneLine[strlen(oneLine) - 1] = '\0'; 
     } 
     sn = strtok(oneLine, " , "); 
     fn = strtok(NULL, " , "); 
     ph = strtok(NULL, " , "); 
     co = strtok(NULL, " , "); 

     if (head == NULL) 
     { 
      head = (struct contact *)malloc(sizeof(struct contact)); 
      ptrList = head; 
       strcpy(head->fName,fn); 
       strcpy(head->sName,sn); 
       strcpy(head->phone,ph); 
       strcpy(head->company,co); 

      head->prev = NULL; 
      head->next = NULL; 

     } 
     else 
     { 
      newContact = (struct contact *)malloc(sizeof(struct contact)); 
      head->next = newContact; 
      newContact->prev = head; 
      newContact->next = NULL; 

      strcpy(newContact->fName, fn); 
      strcpy(newContact->sName, sn); 
      strcpy(newContact->phone, ph); 
      strcpy(newContact->company, co); 

      head = newContact; 
     } // end of (ptrList == NULL) 

    } // end of while(!feof(fptr)) 
    fclose(fptr); 
    return(ptrList); 

Это, как я определил контакт:

struct contact { 
       char sName[CONTACT_MAX+1]; 
       char fName[CONTACT_MAX+1]; 
       char phone[CONTACT_MAX+1]; 
       char company[CONTACT_MAX+1]; 
       struct contact *prev; 
       struct contact *next; 
       }; 
+1

Вы не инициализируют '' head' к NULL' перед использованием (в 'if' условие) – Kninnug

+0

Я просто сделал это, но это все еще crashing..What иначе вы думаете, что это может быть? – user2324059

+0

Как вы определяете «контакт»? –

ответ

1

Здесь я попытался резюмировать:

sn = strtok(oneLine, " , "); 
fn = strtok(NULL, " , "); 
ph = strtok(NULL, " , "); 
co = strtok(NULL, " , "); 

Вы сильно опираясь на правильный формат, который не может быть в случае ,

sn = strtok(oneLine, " , "); 
fn = sn ? strtok(NULL, " , ") : NULL; 
ph = fn ? strtok(NULL, " , ") : NULL; 
co = ph ? strtok(NULL, " , ") : NULL; 

if (!co) continue; // bad string 

Как BLUEPIXY отметил:

printf("\nCouldn't open %s...", "test.csv"); 

Отчисления может выглядеть проще в C:

head = malloc(sizeof(*head)); 

fgets может не:

if (fgets(oneLine, CONTACT_MAX, fptr) == NULL) break; // error, do something... 

И ООН инициализирован head переменных (благодаря Kninnug):

struct contact *head = NULL; // otherise it contains garbage 
+0

Спасибо за ввод, я пробовал приведенный выше код, но я все еще получаю ошибку синтаксического анализа. – user2324059

+0

@ user2324059 Ты имеешь ввиду, что он все еще падает? –

+0

Да, он все еще сбой – user2324059

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