| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1279 人关注过本帖
标题:求各位高手指点,怎样间隔读取
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你編譯得到我的程序執行一下就知道了,我絕不會再使用舊式的不安全函數,你要麽裝一套新版的VC,要麽把我的代碼弄懂了改用舊式的不安全函數,很容易改的。我給你編譯後的exe文件沒用,因爲這需要運行庫,還是得安裝對應版本的VC庫,所以最好你自己編譯。

[ 本帖最后由 TonyDeng 于 2014-4-21 19:13 编辑 ]

授人以渔,不授人以鱼。
2014-04-21 19:07
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
衹要是全組合,就不存在需要判斷有多少種可能性的問題,因爲隨便取8個字符的一串,必定是8模體之一,所以我的代碼根本不需要理會那些字符內容是什麽,祗要計數就可以了。每次讀8個字符,然後往後偏移interval再讀8個,一直到讀不成8個為止,整個程序的原理就是這麽簡單。

授人以渔,不授人以鱼。
2014-04-21 19:11
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用TonyDeng在2014-4-21 19:05:21的发言:


沒錯啊,用我的程序,設置間隔為1,結果是4999993啊。


您好,这个程序在我这里有错误,错误如下。
我也不知道哪错了。
f:\c++\111 计算模体出现频率、相对频数、总频数、平均频数等\3 统计八模体出现次数(kbp间隔)快又准 - 副本\1.cpp(16) : error C2065: 'printf_s' : undeclared identifier
f:\c++\111 计算模体出现频率、相对频数、总频数、平均频数等\3 统计八模体出现次数(kbp间隔)快又准 - 副本\1.cpp(29) : error C2065: 'errno_t' : undeclared identifier
f:\c++\111 计算模体出现频率、相对频数、总频数、平均频数等\3 统计八模体出现次数(kbp间隔)快又准 - 副本\1.cpp(29) : error C2146: syntax error : missing ';' before identifier 'error'
f:\c++\111 计算模体出现频率、相对频数、总频数、平均频数等\3 统计八模体出现次数(kbp间隔)快又准 - 副本\1.cpp(29) : error C2065: 'error' : undeclared identifier
f:\c++\111 计算模体出现频率、相对频数、总频数、平均频数等\3 统计八模体出现次数(kbp间隔)快又准 - 副本\1.cpp(29) : error C2065: 'fopen_s' : undeclared identifier
f:\c++\111 计算模体出现频率、相对频数、总频数、平均频数等\3 统计八模体出现次数(kbp间隔)快又准 - 副本\1.cpp(51) : warning C4018: '==' : signed/unsigned mismatch
执行 cl.exe 时出错.

1.obj - 1 error(s), 0 warning(s)
2014-04-21 19:19
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
看21樓的回覆。

授人以渔,不授人以鱼。
2014-04-21 19:25
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用TonyDeng在2014-4-21 19:25:42的发言:

看21樓的回覆。


大神,实在不好意思,实在看不懂你的程序。
她是怎么读文件,怎么输出文件的呀?
我下载了Visual Studio 2005,但是还是操作不明白。麻烦您了!!!!
2014-04-22 10:33
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
首先你能不能編譯和運行了?其次結果對不對?若不是你所要的結果,解釋了也沒用。

下面是補上前面一個bug的代碼:
程序代码:
/*
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);

    printf_s("Press any key to continue...");
    _getch();

    return EXIT_SUCCESS;
}

int get_statistics(FILE* file, const int interval)
{
    int number = 0;

    char* buffer = new char[max(interval, data_length)];
    if (fread(buffer, sizeof(char), data_length, file) == data_length)
    {
        ++number;
        while (fread(buffer, sizeof(char), interval, file) == interval)
        {
            ++number;
        }
    }
    delete[] buffer;

    return number;
}

其實核心代碼就是後面那個函數,把文件打開了之後,使用後面那個函數就是了,那些是很基本的語法,沒什麽難懂的。

[ 本帖最后由 TonyDeng 于 2014-4-22 11:12 编辑 ]

授人以渔,不授人以鱼。
2014-04-22 11:10
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 26 楼 TonyDeng
您好,您的程序统计的是全部8模体的出现次数。
能再此基础上统计每种不同8模体出现的次数吗?
谢谢!!!
2014-04-22 11:30
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 26 楼 TonyDeng
您看,您的程序只需要我改动这两个地方就对了吧。
谢谢!!!
 printf_s("命令行格式: %s <E:\\酵母\\光学与信息学\\000随机序列> <1>\n", strrchr(argv[0], '\\') + 1);
 errno_t error = fopen_s(&file, "E:\\酵母\\光学与信息学\\000随机序列", "rb");
2014-04-22 11:33
鸥翔鱼游
Rank: 5Rank: 5
等 级:职业侠客
帖 子:182
专家分:323
注 册:2014-4-19
收藏
得分:0 
看了此贴菜鸟又涨姿势了
2014-04-22 14:28
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
是的,改那兩個地方就可以了。

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



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

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