fclose () verursacht einen Segmentierungsfehler

Ich habe eine tabulatorgetrennte Textdatei, die ich analysiere. Die erste Spalte enthält Zeichenfolgen des FormatschrX, woherX bezeichnet einen Satz von Zeichenfolgen, z. B. "1", "2", ..., "X", "Y".

Diese sind jeweils in einemchar* namenschromosome, da die Datei analysiert wird.

Die Textdatei ist in der ersten Spalte lexikographisch sortiert, d. H. Ich werde eine Anzahl von Zeilen haben, die mit "chr1" und dann "chr2" usw. beginnen.

Bei jedem "chrX" -Eintrag muss ich eine andere Datei öffnen, die diesem Eintrag zugeordnet ist:

FILE *merbaseIn;

// loop through rows...

if (chromosome == NULL)                                                                                                                                                   
    openSourceFile(&chromosome, fieldArray[i], &merbaseIn, GENPATHIN);                                                                                                      
else {                                                                                                                                                                    
    if (strcmp(chromosome, fieldArray[i]) != 0) { // new chromosome                                                                                                   
        fclose(merbaseIn); // close old chromosome FILE ptr                                                                                                                                                                                                                                    
        free(chromosome); // free old chromosome ptr                                                                                                                          
        openSourceFile(&chromosome, fieldArray[i], &merbaseIn, GENPATHIN); // set up new chromosome FILE ptr                                                                  
    }                                                                                                                                                                       
}  
// parse row

Ich habe die FunktionopenSourceFile das ist wie folgt definiert:

void openSourceFile (char** chrome, const char* field, FILE** filePtr, const char *path) {
    char filename[100];                                                                                                                                                           
    *chrome = (char *) malloc ((size_t) strlen(field));
    if (*chrome == NULL) {                                                                                                                                                        
        fprintf(stderr, "ERROR: Cannot allocate memory for chromosome name!");                                                                                                      
        exit(EXIT_FAILURE);                                                                                                                                                         
    }                                                                                                                                                                             

    strcpy(*chrome, field);                                                                                                                                                       
    sprintf(filename,"%s%s.fa", path, field);                                                                                                                                     

    *filePtr = fopen(filename, "r");                                                                                                                                              
    if (*filePtr == NULL) {                                                                                                                                                       
        fprintf(stderr, "ERROR: Could not open fasta source file %s\n", filename);                                                                                                  
        exit(EXIT_FAILURE);                                                                                                                                                         
    }                                                                                                                                                                             
}      

Das Problem ist, dass meine Anwendung mit einem Segmentierungsfehler beendet wird, der vom ersten Chromosom zum zweiten Chromosom übergeht (vonchr1 zuchr2) in der folgenden Zeile, in der ich die erste Chromosomendatei schließe, die ich geöffnet habe:

fclose(merbaseIn);

Ich weiß, dass ich nicht vorbeigehefclose Ein NULL-Zeiger, da ich bis zum Segmentierungsfehler Daten aus dieser Datei lese. Ich kann dies sogar in eine Bedingung einwickeln und bekomme trotzdem den Fehler:

if (merbaseIn != NULL) {
    fclose(merbaseIn);
}

Weiter weiß ichopenSourceFile funktioniert (zumindest fürchr1, beim Einrichten des ersten Dateihandles vonFILE*), weil meine Anwendung analysiertchr1 Zeilen und liest Daten aus demFILE* Quelldatei richtig.

Worum geht es hier?fclose Aufruf, der einen Segmentierungsfehler verursacht?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage