我有一个正在解析的制表符分隔的文本文件。它的第一列包含格式为 的字符串chrX
,其中X
表示一组字符串,例如“1”、“2”、...、“X”、“Y”。
在解析文件时,这些每个都存储在char*
被调用的 中。chromosome
文本文件按字典顺序在第一列排序,即,我将有许多行以“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 指针,因为直到出现分段错误,我才从这个文件中读取数据。我什至可以将它包装在一个条件中,但我仍然得到错误:
if (merbaseIn != NULL) {
fclose(merbaseIn);
}
此外,我知道openSourceFile
有效(至少对于chr1
,在设置 的第一个文件句柄时FILE*
),因为我的应用程序解析行并正确地从源文件chr1
中读取数据。FILE*
这个fclose
调用导致分段错误发生的原因是什么?