2014-09-24 2 views
0

Мне нужна помощь в выяснении того, как правильно сканировать файл с текстом, чтобы поместить информацию в связанный список. Файл указан:Не удается правильно сканировать файл для LinkedList

12 JackSprat 2  1 65000 

13 HumptyDumpty 5 3 30000 

17 BoPeep 2  3  30000 

20 BoyBlue 3 2  58000 

0 

0 Является индикатором того, когда файл закончился. Всякий раз, когда я запускаю свой код, он работает 5 раз, но только сохраняет первую строку. Когда я печатаю информацию связанного списка, она просто печатает первую строку 5 раз. Мне нужно прочитать весь файл, а затем остановиться на 0, но я довольно тупой. Вот мой код.

struct employeeData* initializeList(struct employeeData *head, FILE *ifp){ 
struct employeeData *temptr; 
struct employeeData *newnode; 

printf("testin\n"); 

    while(!feof(ifp)) 
    { 
     newnode = (struct employeeData*)malloc(sizeof(struct employeeData)); 

     if (head == NULL) 
     { 
      head = newnode; 
      head->next = NULL; 
     } 
     else 
     { 
      temptr = head; 
      while(temptr->next != NULL) 
      { 
       temptr = temptr->next; 
      } 
      temptr->next = newnode; 

     } 
     fscanf(ifp, "%d%s%d%d%lf", &newnode->EMP_ID, &newnode->name, &newnode->dept, &newnode->rank, &newnode->salary); 
    } 

return head;} 

Что действительно странно, если я удалю printf ("testin \ n"); затем код выдается из командной строки.

+2

Любопытный: Что или кто предложил использовать 'while (! Feof (ifp))', чтобы определить, когда прекратить чтение? – chux

+1

Прежде всего, не стоит 'while (! Feof (...))', он не будет работать так, как вы ожидаете. Причина в том, что флаг eof не установлен до * после *, который вы пытаетесь прочитать из-за конца файла. Это означает, что ваш цикл будет повторяться один раз для многих, и у вас будет два узла в конце с теми же данными. –

+2

Предложите 'newnode-> name' в' fscanf() ', а не' & newnode-> name'. – chux

ответ

1

newnode = (struct employeeData *) malloc (sizeof (struct employeeData)); добавить строку: newnode-> next = NULL;

или использовать calloc

если голова! = NULL, то возвращать без изменений голову, это именно то, что вы хотели?

+0

Да, спасибо, что решил сбой моей программы, если я удалил инструкцию printf. Но остается вопрос о том, как выйти из цикла while, когда он читает это значение 0. На данный момент я могу использовать цикл for, потому что знаю, сколько строк для чтения, но вещь - количество строк, которые могут быть изменены. Так почему-то цикл while должен знать, когда он читает в этом 0 в конце. – Enigma

+1

вы не можете использовать функцию feof(), но вам нужно сделать так: fscanf ("% d", &tmp); if (! Tmp) {// цикл должен быть завершен} else {// хранить значение tmp в соответствующее структурное поле} Затем продолжайте читать файл, но без первого значения строки –

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