| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1279 人关注过本帖
标题:求各位高手指点,怎样间隔读取
只看楼主 加入收藏
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
结帖率:93.94%
收藏
已结贴  问题点数:30 回复次数:30 
求各位高手指点,怎样间隔读取
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;
}
2014-04-19 18:58
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:30 
你這個課題弄好久了喲

授人以渔,不授人以鱼。
2014-04-19 19:03
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
是的,因为我是做信息学的学生,本身又是学物理的,所以计算机这块个别棘手的让我有些难以处理
2014-04-19 20:06
ying8501
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:1092
专家分:1446
注 册:2008-11-24
收藏
得分:0 
没看懂你的问题,是不是:
1)你的原始基因序列在一个文本文件中,很长可能有几万或几十万个碱基。---还是你自己随机构造?
2)你需要把间隔k的,8连体基因段取出来,放在另外一个文本文件中。--- 还是做什么处理,或统计什么?
。。。
你解释清楚,大家才好帮你。
2014-04-19 20:07
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你把數據文件放上來看看

授人以渔,不授人以鱼。
2014-04-19 20:10
xkwy0000
Rank: 6Rank: 6
等 级:贵宾
威 望:11
帖 子:107
专家分:441
注 册:2013-2-8
收藏
得分:0 
4^8=64k,可以用word(2*byte)表示;用c中嵌入汇编,移位指令,效率高100倍
2014-04-19 20:13
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 5 楼 TonyDeng
随机序列.rar (1.39 MB)

这就是那个文件。
我是统计每个8模体在碱基序列中出现的次数(8模体共有4的8次幂个)
当然还要统计其它k模体在碱基序列中出现的次数(k模体共有4的k次幂个)
2014-04-19 20:31
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
我不是這個專業的,不懂你的“模體”是什麽概念,祗能照你1樓所描述的那樣試做一下。晚些我空一點再做。

授人以渔,不授人以鱼。
2014-04-19 20:33
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 8 楼 TonyDeng
ATCATCAT就指一个八模体。这样的模体有4的8次幂个。
非常感谢你。
因为以前只需以1个碱基为间隔计算8模体个数
这回不行了,需要以k个碱基间隔计算。
非常谢谢!!!
2014-04-19 21:21
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
/*
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个字符。
*/

#include <Windows.h>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <conio.h>

int get_statistics(FILE* file, const int interval);

const int data_length = 8;

int main(int argc, char* argv[])
{
    if (argc < 3)
    {
        printf_s("命令行格式: %s <文件名> <間隔>\n", strrchr(argv[0], '\\') + 1);
        _getch();
        return EXIT_FAILURE;
    }

    const char* filename = argv[1];
    int interval = atoi(argv[2]);
    if (interval == 0)
    {
        interval = 1;
    }

    FILE* file;
    errno_t error = fopen_s(&file, filename, "rb");
    if (error != 0)
    {
        printf_s("文件 %s 打開失敗!Error Code = %d\n", filename, GetLastError());
        _getch();
        return EXIT_FAILURE;
    }
    printf_s("以 %d 為間隔的八聨體出現次數 = %d\n", interval, get_statistics(file, interval));
    fclose(file);

    _getch();
    return EXIT_SUCCESS;
}

int get_statistics(FILE* file, const int interval)
{
    char buffer[data_length + 1];
    int number = 0;

    if (fread(buffer, sizeof(char), data_length, file) == data_length)
    {
        ++number;
        while (fread(buffer, sizeof(char), interval, file) == interval)
        {
            ++number;
        }
    }

    return number;
}

這個程序,本質上就是統計文件中指定長度的字符串數目。

[ 本帖最后由 TonyDeng 于 2014-4-20 00:18 编辑 ]

授人以渔,不授人以鱼。
2014-04-20 00:06
快速回复:求各位高手指点,怎样间隔读取
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026787 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved