2017-01-03 14 views
0

Я пытаюсь создать связанный список, содержащий числа, и записать эти числа в файл, а затем прочитать один и тот же файл и прочитать данные в файле и распечатать их номера.C: выходные ошибки связанные списки и запись в файл и чтение из файла

Что я думаю проблема в том, что что-то не так при чтении файла.

Я добавил инструкции som print для отладки, и при печати того, что я пишу в файл, это выглядит нормально. Но когда я читаю файл и печатаю, я получаю первый номер, введенный пользователем дважды. например:

input: 1,2,3 
output:3,2,1,1 

Я не знаю, есть ли проблема с моим связанным списком, запись в файл или, если это чтение. Поэтому я был бы признателен за любые материалы, которые помогут мне лучше понять.

Благодаря

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 


typedef struct postTyp 
{ 
    int num; 
    struct postTyp *next; 
}postTyp; 

FILE *fp; 

int main() 
{ 
    postTyp *l, *p; //l=list , p=pointer 

    l = NULL; 
    p=malloc(sizeof(postTyp)); 


    //Creates linked list until user enters 0 
    printf("Enter a number, 0 to exit: "); 
    scanf("%i", &p->num); 

    while (p->num != 0) 
    { 
     p->next=l; 
     l=p; 
     p=malloc(sizeof(postTyp)); 
     printf("Enter a number, 0 to exit: "); 
     scanf("%i", &p->num); 

    } 
    free(p); 
    p=l; 

    //write the linked list to file 
    fp = fopen("test.txt", "w"); 
    while(p->next != NULL) 
    { 
     printf("%2i", p->num); 
     fwrite(p, 1, sizeof(postTyp), fp); 
     p=p->next; 
    } 
    printf("%2i", p->num); 
    fwrite(p, 1, sizeof(postTyp), fp); 
    fclose(fp); 

    printf("\n"); 

    //Code below to read the file content and print the numbers 
    fp = fopen("test.txt", "r"); 

    fread(p,sizeof(postTyp),1,fp); 
    fseek(fp,0,SEEK_SET); 

    //The first number entered at the beginning, will be printed twice here. 
    while(!feof(fp)) 
    { 
     fread(p,sizeof(postTyp),1,fp); 
     printf("-----\n"); 
     printf("%i\n", p->num); 
    } 

    fclose(fp); 


    return 0; 


} 
+3

Ваша мысль о чем-то неправильном при чтении файла верна: Возможный дубликат [Why is "while (! Feof (file))" всегда неправильно? "(Http://stackoverflow.com/questions/5431941/why -is-то время-feof-файлы всегда-неправильно). –

+1

while (p-> tal! = 0). где вы определили члена «tal»? –

+0

спасибо, ребята, все комментарии помогли, когда поняли проблему с! Feof – Taimour

ответ

2

Из Fread руководства (https://linux.die.net/man/3/fread):

Fread() не делает различий между истекшим файла и ошибок, и абоненты должны использовать feof (3) и FERROR (3) определить, что произошло.

Итак, перед печатью p-> num вы должны проверить возвращаемое значение fread.