2014-08-28 1 views
0

Добрый день, каждый, Получил это упражнение из моего профессионального веб-пространства. У меня есть такой текстовый файл:C, Код: Блок, еще один сиггэгв, списки

Simon Phillips 30 
Neil Peart 45 
Vinnie Colaiuta 50 

Я хочу сохранить это в список, так вот мой код:

struct listplot { 
    char name[25]; 
    char sur[25]; 
    int age; 
    struct listplot *next; 
}; 

typedef struct listplot EL; 

EL *list; 

int filescan(EL *current) 
{ 
    FILE *in; 
    int count=0; 
    in=fopen("persone.txt", "r"); 
    if (ferror(in)) 
    { 
     printf("File Error\n"); 
     return count; 
    } 
    do 
    { 
     current=malloc(sizeof(EL)); 
     fscanf(in,"%s%s%d", current->name, current->sur, &current->age); 
     current->next=NULL; 
     if (!feof(in)) count=count+filescan(current->next); 
    } 
    while (!feof(in)); 
    return count; 
} 

В main я есть:

int count=filescan(list); 

Этот код не будет работать. В отладке кажется, что цикл «do» бесконечен, но в конечном итоге программа вылетает с ошибкой сегментации. Может ли кто-нибудь помочь мне с этим? Большое спасибо.

+0

Не читать строки без указания максимальной длины. И не думайте, что чтение преуспевает. – chris

+0

НЕ РЕШАЙТЕ свою функцию filecan! – Pieter21

+0

Почему я не должен возвращаться? И почему это не должно получиться? – user3783681

ответ

0

Многие improvents, чтобы сделать его более надежным:

Инициализировать этот элемент правильно:

EL* list_header = NULL; /* Points to first element */ 

Увеличение уровня косвенности здесь:

int filescan(EL** current) 
{ 

В основной функции вы должны пройти адрес списка_header:

count = filescan(&list_header) 

Переместите этот раздел в одну функцию, единственной задачей которой является открытие файла.

FILE *in; 
int count=0; 
in=fopen("persone.txt", "r"); 
if (ferror(in)) 
{ 
    printf("File Error\n"); 
    return count; 
} 

И возвращать 0, если значение NULL или по ошибке.

do 
{ 

Сначала сделать проверку и проверить, если он заполняет 3 параметр по

EL els = {0}; /* element for scanning */ 

    if (fscanf(in,"%s%s%d", els.name, els.sur, &els.age) == 3) 
    { 

Перемещения этого в функцию, которая создает/заполняющую/копирует новый EL для Удачно заполненного ELS

current->next = create_duplicate_EL_for(els); 

/* the duplicator should malloc and fill, and set next to NULL */ 
    current=malloc(sizeof(EL)); 
    // some strcpys // 
    current->next=NULL; 

Видимо, вы хотите, чтобы счет так увеличил его.

И зацикливание, установите

current = current->next; 

Завершите Scanf ветку с другой, если мы не найдем в точности 3 элемента:

else 
    { 
     /* debug/error log code here */ 
    } 
} 
while (!feof(in)); 
return count; 
+0

Если я изменяю 'filescan (EL * current' to' filescan (EL ** current', я получаю эту ошибку 'error: запрос для имени участника ' в чем-то не структуре или союзе », то же самое можно сказать о суре и возрасте – user3783681

+0

. Затем вам нужно разыменовать его с помощью current-> name или (* current) .name. – Pieter21

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