我有一个制表符分隔的文本文件,我正在解析。 其第一列包含格式为chrX字符串,其中X表示一组字符串,例如“1”,“2”,......,“X”,“Y”。
当解析文件时,这些都存储在称为chromosome的char* 。
文本文件按字典顺序排在第一列,即,我将有一些以“chr1”开头的行,然后是“chr2”等。
在每个“chrX”条目中,我需要打开与此条目关联的另一个文件:
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
我有openSourceFile函数,定义如下:
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);
}
}
问题是我的应用程序在下一行从第一个染色体到第二个染色体(从chr1到chr2 )退出分段错误,在那里我关闭了我打开的第一个染色体文件:
fclose(merbaseIn);
我知道我没有传递fclose一个NULL指针,因为直到Segmentation Fault,我正在从这个文件中读取数据。 我甚至可以在条件中包装它,我仍然得到错误:
if (merbaseIn != NULL) {
fclose(merbaseIn);
}
此外,我知道openSourceFile有效(至少对于chr1 ,在设置FILE*的第一个文件句柄时),因为我的应用程序解析chr1行并正确地从FILE*源文件中读取数据。
这个fclose调用导致分段错误发生的原因是什么?