求各位高手指点,怎样间隔读取
TCATAGTAGGCATTCAACGTTCCATCGATTCCTACGTCAGAAAACTCAGCGCAATCCCAATTCGCACGATTGGTTGCGTAGAATTTTGTCAAACGAGGGGAGGTTGTACCTAATGTGCATGGGTCTGTTATACAATTATTTCAATACTCCTTAATCATACAGATTTGGACGAAAAAGCGCGTACGTCCCCTGGTAACAAGTTTCGGGGTTAACATCACCAGATGCATGAAGTTGTCTGGCAGGGCTAGTATTAACGCCGAACAAACTCGTGTGGCCAGTGGCGTTCGGGGCACAGTTTATAAGAGCGGGGAATTAATAAGACCCTTAAATTCTAGGAGTAAGTGTGACAATCCGATCTATGTCC这是一段碱基序列,当然实际序列要比它长。序列由A、T、C、G四个字符无序组成,现在要测知每种八联体组合(即8个位置,每个位置可有A、T、C、G中的任一个填充,则8个位置共有4^8个八联体组合)在文件(上面已给出)中的出现次数。
注意:假设这一段基因序列为AGCGTACTAG,则如果以1为间隔这段序列里有3个八联体,即第一个字符至第八个字符,第二个字符至第九个字符,第三个字符至第十个字符。
则如果以2为间隔这段序列里有2个八联体,即第一个字符至第八个字符,第3个字符至第10个字符,
则如果以3为间隔这段序列里有1个八联体,即第一个字符至第八个字符.第4个字符至第11个字符为第2个八联体,但上述字符串只有10个字符。
但实际序列很长,而我设置的间隔为k又是个变量,请问这个程序怎么遍呀?
谢谢!!!!
这是好友帮忙的一个程序,但只能以1为间隔,2、3、、、、等不行。
#include <stdio.h>
#define N_A 6
#define N_B (1u<<(2*N_A))
int main()
{
static unsigned long octamer_count[N_B] = { 0 }; //当跑八模体以上时,因为数据量已经很大,要价个static,八模体以下不用它
////// 1 //////
{
FILE* file = fopen( "E:\\酵母\\光学与信息学\\碱基随机.txt", "rb" );
if( !file )
{
puts( "cannot open the input file.");
return 1;
}
{
unsigned long octamer;
unsigned long octamer_n = 0;
char c;
for( ; fread(&c,1,1,file)==1; )
{
switch( c )
{
case 'A':
octamer = (octamer*4+0)%N_B; ++octamer_n; break;
case 'T':
octamer = (octamer*4+1)%N_B; ++octamer_n; break;
case 'C':
octamer = (octamer*4+2)%N_B; ++octamer_n; break;
case 'G':
octamer = (octamer*4+3)%N_B; ++octamer_n; break;
case '\r':
case '\n':
continue;
default:
puts( "Fuck" );
case 'N':
octamer_n = 0;
continue;
}
if( octamer_n < N_A )
continue;
octamer_n = N_A;
++octamer_count[octamer];
}
}
fclose( file );
}
////// 2 //////
{
FILE* fileout = fopen( "E:\\酵母\\光学与信息学\\碱基随机19模体.txt", "wt" );
if( !fileout )
{
puts( "cannot open the output file.");
return 2;
}
{
unsigned int i, j;
for( i=0; i<sizeof(octamer_count)/sizeof(octamer_count[0]); ++i)
{
if( octamer_count[i] == 0 )
continue;
for( j=N_B/4; j!=0; j/=4 )
fprintf( fileout, "%c", "ATCG"[i/j%4] );
fprintf( fileout, "\t%u\n", octamer_count[i] );
}
}
fclose( fileout );
}
return 0;
}