2013-09-25 2 views
1

Я попытался с помощью функции mygets так, что fgets будет читать только одну строку:Fgets из файла до конца строки

void * mygets(char *name, int len, FILE * stream) 
{ 
    fgets(name,len,stream); 

    if (name[strlen(name) - 1] == 10) 
    { 
     name[strlen(name) - 1] = 0; 
    } 
} 

И содержимое файла:

John Smith //Name 

19 // Age 

175.62 // Height 

87 // Weight 

Использование одного linked- список, я просто хотел *mygets читать только до John Smith затем сохранить его в ЬурейеЙ структуру имени client по:

typedef struct nodebase{ 
    char name[40]; //Just in case, the client's name can be long 
    int age; 
    double height; 
    int weight; 
    struct nodebase *next; 
    }listnode; 

int main() 
{ 
listnode *head; 
listnode *tail; 
listnode *client; 
FILE *f; 

f=fopen("filename.txt","r"); 

while(!feof(filename)) 
{ 
    client = malloc(sizeof(listnode)); 
    mygets(client->name,40,filename); 

    if (head == NULL) 
    { 
     head = client; 
    } 
    else 
    { 
     tail->next=client; 
    } 
    tail = client; 
    client =head; 
} 

while(client!=NULL) 
{ 
    printf("\n%s\n",&client->name); 
    client = client->next; 
} 

} 

Но проблема в том, что программа печатает весь файл (включая возраст, высоту и вес).

Я не могу найти что-то не так с моим *mygets.

*** Я использую Крошечные C на Windows,

ответ

1

У вас есть много опечаток и ошибок в коде вы публикуемый в вашем вопросе.

  1. FILE *f Объявление не заканчивается точкой с запятой;
  2. Состояние в while(client!NULL) не действует C состояние, оно должно быть !=;
  3. head и tail не указано.

Я надеюсь, что, кстати, у вас есть рабочая версия этого кода.

Что касается вашего вопроса, код просто работает, поскольку он написан - ваша функция mygets читает строку из файла, поэтому в вашем цикле while(!feof(filename)) вы читаете содержимое файла по строкам (имя, возраст, высота, вес) и помещать записи в связанный список. Затем вы просто печатаете их, перемещая связанный список от начала до конца.

+0

Что я хотел, чтобы код должен был назначать каждую отдельную строку в переменные структуры Typedef. –

+0

Но вы читаете только имя в своих 'mygets (client-> name, 40, filename);'. Вы должны также прочитать возраст, высоту, вес из файла и заполнить соответствующие поля вашей структуры. – zavg

+0

Позвольте мне перефразировать мой вопрос, код должен ТОЛЬКО читать имя в моих 'mygets (client-> name, 40, filename);' но он читает ENTIRE содержимое файла ... –

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