2013-09-24 1 views
1

Ошибка, с которой я получаю навигацию к файлу strcat.asm и задает точку останова при входе в основной цикл. Метод readFile, который я создал, разбивается непосредственно перед тем, как строки обозначены в этом цикле strlen :strcat ошибка чтения csv-файла из структуры

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 = sn ? strtok(NULL, " , ") : NULL; 
     ph = fn ? strtok(NULL, " , ") : NULL; 
     co = ph ? strtok(NULL, " , ") : NULL; 

У кого-нибудь есть идеи, в которых я ошибаюсь?

Мои ReadFile() выглядит следующим образом:

struct contact *readFile(struct contact *ptrList) 
{ 
    struct contact *head = NULL; 
    struct contact *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...", "test.csv"); 
     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 = sn ? strtok(NULL, " , ") : NULL; 
     ph = fn ? strtok(NULL, " , ") : NULL; 
     co = ph ? strtok(NULL, " , ") : 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); 
} 

Формат файла выглядит так:

Фамилия, FirstName, номер, компании

в Builder, Bob, 1234567, Bob's

Unknown, совок, 8765645, Боба

+0

Не проверял ваш код, но предлагая из вашего описания, это может быть не оконечная строка, которая делает проблему, не так ли? – dhein

+0

Может случиться так, что ваш первый вызов strtok имеет указатель NULL в качестве параметра? или ваш главный код избегает этого? – dhein

ответ

1
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); 

Вы derefferencing head без членов head «s был инициализирован, то будет неопределенное поведение и, вероятно, вызывает свою ошибку, потому что strcpy ожидает \0 -завершённый массив , Но поскольку вы не инициализировали членов группы, вы не можете знать, что они прекращены или нет. И даже если это так, проблема si, которую strcpy() должен прочитать для проверки \0, и пока он не инициализирован, strcp() все равно читает неинициализированную память.

И, наконец стандартная цитата:

J.2 Неопределенное поведение

1 поведение не определено в следующих случаях:

[..]

Значение объект, назначенный функцией malloc, используется (7.20.3.3).

Так решение было бы memset() голову 0 так memblock везде будет прекращена до тех пор, вы не отменяют его.

+1

Не только это, но и в ветке «newContact» это та же ошибка. – Devolus

+0

Итак, что я должен инициализировать 'head' для? –

+0

@Brian J, что я тоже прошу себя .... Думаю, я что-то смешал в голове и говорил мусор ... просто дай мне минуту, чтобы исправить мой разум ... – dhein