我有一个DNA序列文件(A,T,G和C);它没有空格,逗号或行分隔符。我必须从中读取前10,000个值,并找到重复最多的两个五个值模式。

到目前为止,我试图将不同的模式存储在这样的简单结构中:

typedef struct
{
    char* pattern;
    int count;
} pattern;


当我发现更多新模式时,将通过以下周期进行存储:

int size = 10;
int pos = 0; //positions occupied
pattern* patrones = calloc(10, sizeof(pattern));

char temp[6];

FILE* file = fopen("dnaChain.txt", "rb");
while(file != NULL)
{
    bool has = false;
    fgets(temp, 6, file);

    for(int i = 0; i <= pos; i++)
    {
        pattern p = patrones[i];
        char* content = p.pattern;
        int comp = strcmp(content, temp);
        if(comp == 0)
        {
            has = true;
            p.count = p.count+1;
        }
    }

    if(!has)
    {
        pattern new;
        new.pattern = temp;
        new.count = 1;
        if(pos == size-1)
        {
            patrones = realloc(patrones, size+10);
            size += 10;
        }
    else{
        patrones[pos] = new;}
        pos++;
    }
}


但是我的代码是错误的,并给我一个segmentation fault错误
当我执行它时,请帮助我。

最佳答案

首先,将所有10000个值读入内存,然后仅对内存中的数据进行操作。

至于查找序列,基本上是简单的子字符串搜索。一个幼稚的解决方案是从前五个字符开始,然后从第二个字符,然后从第三个字符,然后是第四个字符中搜索相同的子字符串。计算找到子字符串的次数。

然后执行相同操作,但从第二个字符开始,然后向前五个字符。从第三个字符,第四个字符中查找该子字符串,依此类推。

在第一次搜索两次之后,您将获得两个计数,一个计数大,一个计数小。如果在下一次搜索中发现一个子串的数目大于当前两个子串的数目,则删除最小的子串并保存当前子串(及其计数)。依此类推,直到您检查了整个字符串。

这将是很多循环,效果不是很好,但是应该可以为您提供所需的结果。

关于c - 如何在C语言中按字符组读取文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36580593/

10-12 00:21
查看更多