I have a tab-delimited text file that I am parsing. Its first column contains strings of the format chrX
, where X
denotes a set of strings, e.g., "1", "2", ..., "X", "Y".
These are each stored in a char*
called chromosome
, as the file is parsed.
The text file is sorted on the first column lexicographically, i.e., I will have a number of rows starting with "chr1", and then "chr2", etc.
At each "chrX" entry, I need to open another file that is associated with this entry:
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
I have the function openSourceFile
that is defined as follows:
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);
}
}
The problem is that my application quits with a Segmentation Fault going from the first chromosome to the second (from chr1
to chr2
) at the following line, where I close the first chromosome file that I opened:
fclose(merbaseIn);
I know I'm not passing fclose
a NULL pointer, because up until the Segmentation Fault, I am reading data from this file. I can even wrap this in a conditional and I still get the Fault:
if (merbaseIn != NULL) {
fclose(merbaseIn);
}
Further, I know openSourceFile
works (at least for chr1
, when setting up the first file handle of FILE*
) because my application parses chr1
rows and reads data from the FILE*
source file correctly.
What is it about this fclose
call that is causing a Segmentation Fault to occur?