我想用C语言计算文本文件中的基因数,三元组是3个字母的集合。 基因由一系列三联体组成,其中包含起点和终点。
基因的开头: ATG
基因末端: TAA,TGA或TAG
如果起点和终点之间至少有一个三联体(例如TAA ATG)不是有效基因,那么该基因被认为是有效的
文本文件的示例,文本文件可以有多行
ATG GCA TAT ATG TGG AAG TAA GTT GTA ATG CAC GAT GGC AAC GGC GGC TAG CCA ATG AAA
这个例子包含两个基因
我到目前为止尝试过,不知道如何找到开始然后结束。
int Count (char *file) {
FILE *ptr = NULL;
int count = 0;
char *start = "ATG";
char *end = "TAA"; // miss TGA, TAG
char chr;
int occur, i;
ptr = fopen(filename, "r"); //open text file
if (ptr == NULL)
return -1;
chr = fgetc(ptr);
while(chr != EOF){
if(ch == start[0]){
for(i=1; i< StrLen(start); i++){
chr = fgetc(ptr);
if(chr == EOF){
occur = 0;
break;
}
else if(chr != start[i]){
chr = fgetc(ptr);
occur = 0;
break;
}
else
occur = 1;
}
if(occur == 1){
count++;
}
} else{
chr = fgetc(ptr);
}
}
if (!feof(ptr)){
return -1;
}
fclose(ptr);
return count;
}
int StrLen(char *word){
int i = 0;
char c = word[0];
while(c != '\0'){
i++;
c = word[i];
}
return i;
}
请帮帮我! :)
答案 0 :(得分:0)
执行此操作的一种方法是使用flex创建扫描仪,让扫描仪完成工作。请查看dinosaur.compilertools.net和FLEX。有一堆老式的特定于域的语言工具,它们有助于为c / c ++生成代码来处理文本序列的语法,语法和解析。您只需使用c程序中生成的代码即可。
作为旁注:如果您的要求允许,您应该使用perl
,因为它是针对这类任务量身定制的。
答案 1 :(得分:0)
尝试从更高级别查看您的问题。你想找到由一系列三胞胎组成的基因。为此你必须阅读三胞胎并测试它是基因的起点或终点还是介于两者之间。
所以,这可能是这样的:
char triplet[4];
while (read_triplet(fp, triplet)) {
if (is_beginning(triplet)) {
/* handle beginning */
} else if (is_end(triplet)) {
/* handle end of gene */
} else {
/* is between */
}
}
然后定义三元组处理的函数:
int read_triplet(FILE *fp, char *triplet) { /* ... */ }
int is_beginning(const char *triplet) { return strcmp(triplet, "ATG") == 0; }
int is_end(const char *triplet)
{
if (strcmp(triplet, "TAA") == 0)
return 1;
if (strcmp(triplet, "TGA") == 0)
return 1;
if (strcmp(triplet, "TAG") == 0)
return 1;
/* No, it's not an end triplet */
return 0;
}
希望这有助于一个开始。