2016-05-24 4 views
-1

Druck, ich habe eine verknüpfte Liste aus einer Datei Eingang drucken, die ich habe es geschaffen, zum Laufen zu bringen:C verlinkte Liste von Datei Beenden nicht nach so

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

typedef struct Vehicle{ 
    int option; 
    char make [30]; 
    char model[30]; 
    int car_manufacture_date; 
    float maximum_velocity; 
    float mass; 
    int seats; 
    struct Vehicle *next;//linked list node 
} vehicle_t; 


int main(){ 

    FILE* fp; 
    fp = fopen("vehicles.crash.txt", "r"); 

    vehicle_t* first_car = malloc(sizeof(vehicle_t)); 
    if (first_car == NULL){ 
     printf("Error. Failed to allocate memory to first_car\n"); 
     exit(1); 
    } 
    vehicle_t* current_vehicle = malloc(sizeof(vehicle_t)); 
    if (current_vehicle == NULL){ 
     printf("Error. Failed to allocate memory to current_vehicle\n"); 
     exit(1); 
    } 
    vehicle_t* new_vehicle = malloc(sizeof(vehicle_t)); 
    if (new_vehicle == NULL){ 
     printf("Error. Failed to allocate memory to new_vehicle\n"); 
     exit(1); 
    } 
    printf("GOOD1\n"); 

    current_vehicle = first_car; 
    new_vehicle = first_car; 
    printf("GOOD2\n"); 

    //Loading vehicles from file to linked list 
    if (fp != NULL) 
    { 
     printf("GOOD3\n"); 
     while (fscanf(fp,"%d %s %s %d %f %f %d", &new_vehicle->option, new_vehicle->make, new_vehicle->model, &new_vehicle->car_manufacture_date, 
     &new_vehicle->maximum_velocity, &new_vehicle->mass, &new_vehicle->seats) != EOF) 
     { 
      printf("GOOD4\n"); 
      current_vehicle->next = new_vehicle; 
      current_vehicle = current_vehicle->next; 
      new_vehicle = malloc(sizeof(vehicle_t)); 
      if (first_car == NULL){ 
       printf("Error. Failed to allocate memory\n"); 
       new_vehicle->next=NULL; 
       exit(1); 
      } 

      printf("GOOD5\n"); 
     } 
    close(fp); 
    printf("Input completed\n"); 
    } 
    else 
     printf("Error! couldn't find file\n"); 

    current_vehicle = first_car; 

    while (current_vehicle != NULL) 
    { 
     printf("Option: %d\tMake: %s\tModel: %s\tManufactured: %d\tMax Velocity: %.2f\tMass: %.2f\tSeats: %d\n", 
     current_vehicle->option, current_vehicle->make, current_vehicle->model, current_vehicle->car_manufacture_date, 
     current_vehicle->maximum_velocity, current_vehicle->mass, current_vehicle->seats); 

     new_vehicle = current_vehicle->next; 
     current_vehicle = current_vehicle->next; 
    }; 
    printf("Printing completed"); 
return 0; 
} 

Alles funktioniert nach rechts, bis der letzten Datei Artikel wird ausgedruckt, danach stürzt das Programm ab. Von dem, was ich in anderen Posts gesehen habe, entspricht die while Schleife ihnen allen.

Die gedruckten "GOOD" Aussagen sind nur Checkpoints

Der Text in der Datei wird formatiert als: 1 Toyota Camry 2010 200,0 1100,0 5

+3

Haben Sie führen Sie Ihr Programm unter einem noch Debugger? –

+2

Benötigt 'current_vehicle-> next = NULL;' nach der Eingabe-Schleife. Außerdem haben Sie viele Speicherlecks. – BLUEPIXY

+0

Warum haben Sie die ersten 3 Mallocs? Ich hätte gedacht, dass Sie nur Speicher für Dinge reservieren müssen, für die Sie echte Daten haben. –

Antwort

0

Ich glaube, Sie vergessen, das ->next Feld der letzten Liste Knoten zu auf NULL. Sie haben gerade malloc aufgerufen, so dass der Wert zufällig sein kann und Ihr Drucken fehlgeschlagen ist.

0

Der Hauptgrund für die Endlosschleife war, das letzte next nicht auf NULL zu setzen [wie andere bereits erwähnt haben].

Aber ich denke, das ist einfacher zu sehen mit dem Code vereinfacht, wie Sie, obwohl meist richtig, war komplizierter als es sein musste.

Wie auch immer, diese kompiliert, aber ich habe nicht testen [bitte unentgeltlichen Stil Bereinigungs verzeihen]:

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

typedef struct Vehicle { 
    int option; 
    char make[30]; 
    char model[30]; 
    int car_manufacture_date; 
    float maximum_velocity; 
    float mass; 
    int seats; 
    struct Vehicle *next;    // linked list node 
} vehicle_t; 

int 
main() 
{ 
    FILE *fp; 

    fp = fopen("vehicles.crash.txt", "r"); 
    if (fp == NULL) { 
     printf("Error! couldn't find file\n"); 
     exit(1); 
    } 

    vehicle_t *first_car = NULL; 
    vehicle_t *previous_vehicle = NULL; 

    // Loading vehicles from file to linked list 
    while (1) { 
     vehicle_t *new_vehicle = malloc(sizeof(vehicle_t)); 

     if (new_vehicle == NULL) { 
      printf("Error. Failed to allocate memory to new_vehicle\n"); 
      exit(1); 
     } 

     // NOTE: the lack of this [in your equivalent code] was the reason 
     // for the infinite loop 
     new_vehicle->next = NULL; 

     if (fscanf(fp, "%d %s %s %d %f %f %d", 
      &new_vehicle->option, new_vehicle->make, new_vehicle->model, 
      &new_vehicle->car_manufacture_date, &new_vehicle->maximum_velocity, 
      &new_vehicle->mass, &new_vehicle->seats) == EOF) { 
       free(new_vehicle); 
       break; 
     } 

     if (first_car == NULL) 
      first_car = new_vehicle; 
     else 
      previous_vehicle->next = new_vehicle; 

     previous_vehicle = new_vehicle; 
    } 

    fclose(fp); 

    vehicle_t *current_vehicle = first_car; 

    while (current_vehicle != NULL) { 
     printf("Option: %d\tMake: %s\tModel: %s\tManufactured: %d\tMax Velocity: %.2f\tMass: %.2f\tSeats: %d\n", 
      current_vehicle->option, current_vehicle->make, 
      current_vehicle->model, current_vehicle->car_manufacture_date, 
      current_vehicle->maximum_velocity, current_vehicle->mass, 
      current_vehicle->seats); 
     current_vehicle = current_vehicle->next; 
    }; 

    printf("Printing completed"); 

    return 0; 
} 
+0

@ paulsm4 Danke für die heads up, ich werde die Antwort anpassen.Ich persönlich benutze '' scanf' nicht viel, also habe ich einfach angenommen, dass der [einfache] Teil korrekt war. Aber die Manpage hier sagt, dass EOF sein kann zurück, also muss ich es wohl testen –

+0

@ paulsm4 Ich habe das Programm getestet und habe am Ende der Eingabe -1 (EOF) bekommen. Das passt also zur Linux Man Seite Der gleiche Weg hier: https://www.freebsd.org/cgi/man.cgi?query=sca nf & sektion = 3 –

+0

@ paulsm4, Sie sind ein wenig verwirrt 'fscanf' gibt' EOF' zurück, wenn das Ende der Eingabe erreicht wird, entweder vor der ersten erfolgreichen Konvertierung oder einem passenden Fehler. Siehe * man fscanf * unter "RETURN VALUE". –