解析中のタブ区切りのテキスト ファイルがあります。その最初の列には、「1」、「2」、...、「X」、「Y」などの一連の文字列を示す形式chrX
の文字列が含まれます。X
ファイルが解析されると、これらはそれぞれ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);
}
}
問題は、次の行で最初の染色体から 2 番目の染色体 ( からchr1
までchr2
) に移動するセグメンテーション フォールトでアプリケーションが終了し、最初に開いた染色体ファイルを閉じることです。
fclose(merbaseIn);
fclose
セグメンテーション違反が発生するまで、このファイルからデータを読み取っているため、NULL ポインターを渡していないことはわかっています。これを条件付きでラップすることもできますが、それでもフォールトが発生します。
if (merbaseIn != NULL) {
fclose(merbaseIn);
}
さらに、アプリケーションが行を解析し、ソース ファイルからデータを正しく読み取るため、 openSourceFile
(少なくともchr1
の の最初のファイル ハンドルを設定するときに) が機能することがわかっています。FILE*
chr1
FILE*
fclose
セグメンテーション違反が発生する原因となっているこの呼び出しの原因は何ですか?