Я пишу код, который читает огромные текстовые файлы, содержащие базы ДНК, и мне нужно иметь возможность извлекать определенные части. Файл выглядит так:
TGTTCCAGGCTGTCAGATGCTAACCTGGGG
TCACTGGGGGTGTGCGTGCTGCTCCAGCCT
GTTCCAGGATATCAGATGCTCACCTGGGGG
...
Каждая строка состоит из 30 символов.
У меня есть отдельный файл с указанием этих частей, то есть у меня есть значение start и значение end . Поэтому для каждого значения start и end необходимо извлечь соответствующую строку в файле.
Например, если у меня есть start = 10, end = 45, мне нужно сохранить строку, которая начинается с 10-го символа первой строки (C) и заканчивается 15-м символ 2-й строки (C) в отдельном временном файле.
Я попытался использовать функцию fread, как показано ниже для тестового файла с вышеуказанными строчками букв. Параметры были start = 1, end = 90, и результирующий файл выглядит так:
TGTTCCAGGCTGTCAGATGCTAACCTGGGG
TCACTGGGGGTGTGCGTGCTGCTCCAGCCT
GTTCCAGGATATCAGATGCTCACCTGGG™eRV
Каждый запуск даст случайные символы в конце.
код:
FILE* fp;
fp=fopen(filename, "r");
if (fp==NULL) puts("Failed to open file");
int start=1, end=90;
char string[end-start+2]; //characters from start to end = end-start+1
fseek(fp, start-1, SEEK_SET);
fread(exon,1, end-start+1, fp);
FILE* tp;
tp=fopen("exon", "w");
if (tp==NULL) puts("Failed to make tmp file");
fprintf(tp, "%s\n", string);
fclose(tp);
Я не мог понять, как fread обрабатывает символы \ n, поэтому я попытался заменить его следующим:
int i=0;
char ch;
while (!feof(fp))
{
ch=fgetc(fp);
if (ch != '\n')
{
string[i]=ch;
i++;
if (i==end-start) break;
}
}
string[end-start+1]='\0';
Создан следующий файл:
TGTTCCAGGCTGTCAGATGCTAACCTGGGGTCACTGGGGGTGTGCGTGCTGCTCCAGCCTGTTCCAGGATATCAGATGCTCACCTGGGGô
(без разрывов строк, что я не против).
Снова при каждом запуске я получаю другой случайный символ вместо «G».
Что я делаю не так? Есть ли способ сделать это с помощью fread или какой-либо другой функции?
Заранее спасибо.