2017-10-28 2 views
0

Ich habe folgende Enum und Struktur:Warum ein Segmentierungsfehler in feof()?

enum Destination { unknown = 0, hosok, parlament, var }; 

struct Client 
{ 
    char name[30]; 
    char email[30]; 
    char phone_num[11]; 
    int client_num; 
    enum Destination destination; 
    struct tm registration_date; 
}; 

Wenn ich die folgende Methode aufrufen, liest sie die erste Struktur und ausdrucken Name ist, dann bekomme ich einen Segmentation Fault.

void list_clientss() 
{ 
    FILE *f = fopen(filename, "r"); 
    if(f == NULL) 
    { 
    perror("Error"); 
    } 
    struct Client client; 
    while(!feof(f)) 
    { 
    fread(&client, sizeof(struct Client), sizeof(struct Client), f); 
    printf("Name: %s\n", client.name); 
    } 
    fclose(f); 
} 

Was habe ich falsch gemacht?

+4

Mögliches Duplikat [Warum ist „während (! Feof (Datei))“ immer falsch?] (Https://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong) –

+2

Sind Sie sicher, dass es in 'feof' segfauling ist? Dein "Freud" -Aufruf ist falsch und du verschwendest deinen Stack. Sie sollten 'fread (& client, sizeof (struct Client), 1, f) aufrufen;' – Cornstalks

+0

Sie sind bereit, _1_ record vom Typ 'struct Client'. Sprich 'fread (& Client, sizeof (struct Client), 1, f);' – Gene

Antwort

2

Erstens Ihre fread Anrufe sollte wie folgt lauten:

fread(&client, sizeof(struct Client), 1, f); 

Zweitens statt feof verwenden, können Sie den Rückgabewert von fread verwenden. fread gibt die Anzahl der zu lesenden Elemente zurück, die Sie übergeben haben. Sie können überprüfen, ob diese Nummer von einer Nummer abweicht. Zum Beispiel

while (fread(&client, sizeof(struct Client), 1, f) == 1) { 
    printf("Name: %s\n", client.name); 
} 

Edit 1: Aktualisieren Sie die while-Schleife, um mehr idiomatische und elegante Version als Wetterfahne vorgeschlagen.

+0

Mehr idiomatische könnte sein 'while (fread (& Client, sizeof (struct Client), 1, f) == 1) {printf ("Name:% s \ n", client.name); } ' –

+0

Danke! Ich habe 'feof' verwendet, weil wir es an der Universität gelernt haben, aber jetzt verstehe ich, warum es schlecht war. – prophet4955

Verwandte Themen