fclose () powoduje błąd segmentacji
Mam plik tekstowy rozdzielany tabulatorami, który analizuję. Pierwsza kolumna zawiera ciągi formatuchrX
, gdzieX
oznacza zestaw łańcuchów, np. „1”, „2”, ..., „X”, „Y”.
Są one przechowywane w achar*
nazywachromosome
, gdy plik jest analizowany.
Plik tekstowy jest posortowany leksykograficznie w pierwszej kolumnie, tj. Będę miał kilka wierszy rozpoczynających się od „chr1”, a następnie „chr2” itd.
Przy każdym wpisie „chrX” muszę otworzyć inny plik powiązany z tym wpisem:
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
Mam funkcjęopenSourceFile
to jest zdefiniowane w następujący sposób:
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);
}
}
Problem polega na tym, że moja aplikacja kończy działanie z błędem segmentacji przechodzącym z pierwszego chromosomu do drugiego (zchr1
dochr2
) w następującym wierszu, gdzie zamykam pierwszy otwarty plik chromosomu:
fclose(merbaseIn);
Wiem, że nie przechodzęfclose
wskaźnik NULL, ponieważ aż do błędu segmentacji, czytam dane z tego pliku. Mogę nawet zawinąć to warunkowo i nadal otrzymuję błąd:
if (merbaseIn != NULL) {
fclose(merbaseIn);
}
Ponadto wiemopenSourceFile
działa (przynajmniej nachr1
, podczas konfigurowania pierwszego uchwytu plikuFILE*
), ponieważ moja aplikacja analizujechr1
wiersze i odczytuje dane zFILE*
plik źródłowy poprawnie.
O co w tym chodzifclose
wywołanie, które powoduje wystąpienie błędu segmentacji?