求修改一下程序,程序没问题。
sequence.zip
(11.65 KB)
#include #include
#include
void dna8_val2str( unsigned long val, char str[8] )
{
assert( val < (1ul<<(8*2)) );
for( size_t i=0; i<8; ++i )
{
str[7-i] = "agct"[val%4];
val >>= 2;
}
}
int main()
{
unsigned long words = 0;
unsigned long numbers[65536] = { 0 };
// 处理
FILE* fin = fopen( "sequence.txt", "r" );
if( !fin )
return 1;
int bav = 0;
unsigned long val = 0;
for( int c; c=fgetc(fin), c!=EOF; )
{
switch( c )
{
case '@': // 遇到@则结束
break;
case '\r':
//case '\n':
++words;
continue;
case 'a':
case 'g':
case 'c':
case 't':
val = ((val<<2)&0xFFFF) | (c%36%5);
if(bav<8) // 不足8个有效字符时先等等
++bav;
else
++numbers[val];
break;
default: // 出现了agct之外的字符
long pos = ftell(fin)-1;
if( c>0x20 && c<0xFF ) // 可显示的字符,就显示其本身
printf( "--- 0x%08lX处出现非法字符\'%c\'\n", pos, (char)c );
else // 不可显示的字符,就显示其对应的ASCII值
printf( "--- 0x%08lX处出现非法字符0x%02hhX\n", pos, (char)c );
}
}
fclose( fin );
// 输出
FILE* fout = fopen( "result.txt", "w" );
if( !fout )
return 3;
for( int i=0; i<65536; ++i )
{
// if( numbers[i] !=0 )
{
char str[8];
dna8_val2str( i, str );
fprintf( fout, "%.8s\t%ld\t%f\n", str, numbers[i], numbers[i]/65536.0 );
}
}
fclose( fout );
printf( "处理完毕\n" );
return 0;
}
程序没有问题,现在这个是统计8个字符的问题。我想改成统计四个字符的程序,自己改了半天也没成功。你可以先运行一下附件,看结果,然后就明白我说的意思了。