2016-11-30 6 views
1

Ich versuche, ein Programm zu schreiben, das Daten aus einer Datei liest und in ein Struct-Array einfügt. Ich habe es geschafft, es in das Array zu setzen, aber ich bekomme dann einen Segmentierungsfehler. Ich glaube, ich muss malloc verwenden, um das struct-Array zu initialisieren, aber ich bin neu in der Programmierung und verstehe nicht wirklich, wie man das macht. Danke für Ihre Hilfe! Ich habe Teile meines Codes kopiert, damit Sie sehen können, was ich getan habe. Ich habe meine Funktionen in diesem Code nicht enthalten.Segmentierungsfehler nach dem Lesen einer Datei in ein Struct-Array

struct Weather 
{ 
    char location; 
    int daynum; 
    double temp; 
    double precip; 
}; 

int main (void) 
{ 
    FILE*openFile; 
    char buffer[COLS][ROWS]; 
    int i = 0; 
    struct Weather loc1; //initialize here? 

    for (i = 0; i <200; i++) 
    { 
     fgets (buffer[i], ROWS, openFile); 
     parseLine(buffer[i], &loc1); 
     printf ("%d %c %d %.2lf %.2lf\n",i, loc1.location, loc1.daynum, loc1.temp, loc1.precip); 

    } 
} 
+2

erstes Problem: Sie müssen die Datei öffnen. Werfen Sie einen Blick auf ['fopen'] (https://linux.die.net/man/3/fopen) – yano

+0

@Mason: Sie können eine der Antworten akzeptieren, indem Sie auf das graue Häkchen unterhalb der Punktzahl klicken. – chqrlie

Antwort

1

Ihre Datei-Stream (openfile) nicht initialisiert; Es zeigt nicht auf eine Datei. Als yano sagte in seinem comment, verwenden Sie fopen(), um den Dateizeiger ordnungsgemäß zu initialisieren.

1
  1. Sie müssen die Datei-Stream mit fopen() vor allen I/O-Operationen initialisieren!

    int main() 
    { 
        char filename[64]; 
        FILE *fp; 
    
        snprintf(filename, sizeof(filename), "hello1234.txt"); 
        if(NULL == (fp = fopen(filename, "r"))) 
        { 
         printf("err, failed when fopen(), %s %s[%d].\n", __FILE__, __FUNCTION__, __LINE__); 
         return -1; 
        } 
        //your code here 
    
        return 0; 
    } 
    
  2. Initialisieren der Struktur

    Beachten Sie, dass malloc() nicht die Struktur initialisieren.

    zwei Methoden:

    M0:

    struct Wetter loc1; memset (& loc1, 0, sizeof (struct Wetter));

    M1:

    struct Wetter loc1 = {0};

  3. man malloc oder klicken Sie auf den Link für eine malloc manual.

0

Mehrere Probleme im Code:

  • Der Stream-Zeiger openFile nicht initialisiert ist, ruft fgets() für sie nicht definiertes Verhalten aufruft. Sie möchten eine Datei für öffnen oder den Wert openFile auf den Standard-Eingabestream stdin setzen.

  • Das Array 2D char sollte in der anderen Reihenfolge definiert werden: ROWS könnte definiert werden, um etwas weniger als 200:

    char buffer[ROWS][COLS]; 
    
  • Sie die gleiche Konstante für den Schleifenzähler und die 2D-Array-Definition verwendet werden sollen .

  • Die Größe des Zeilenpuffers ist COLS, übergeben Sie das an fgets().

  • Sie sollten den Rückgabewert von fgets() testen: es gibt NULL am Ende der Datei zurück und der Inhalt des Zielarrays ist in diesem Fall unbestimmt.

  • ob oder nicht loc1 zu initialisieren hängt davon ab, was die parseLine() Funktion tut. Es würde Sinn machen, dass parseLine() keine Annahmen über den Inhalt der Zielstruktur machen, aber die Quelle wurde nicht veröffentlicht, so dass wir nicht sicher wissen können.

  • die printf Formatbezeichner für Typ double ist %f wird die zusätzliche l einfach ignoriert.

Verwandte Themen