【问题标题】:How to read a file by groups of chars in C?如何在C中按字符组读取文件?
【发布时间】:2016-08-03 11:57:12
【问题描述】:

我有一个 DNA 序列文件(A's、T's、G's 和 C's);它没有空格、逗号或行分隔符。我必须从中读取前 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 错误 当我执行它时,请帮助我。

【问题讨论】:

  • 好吧,我们不能给你一个向你介绍 C 编程的答案。你必须达到一定的水平,并就你遇到的具体问题提出问题。我们无法为您提供这样的帮助!
  • @JohnnyMopp 这是 C++ 参考,而不是 C。我宁愿将 OP 指向 man fread
  • @MarcusMüller 该 wiki 有 C 和 C++ 参考,链接指向 C 参考。
  • @sjsam:不确定,但我没有一个好的选择。集合 {A, C, G, T} 中有 4^5 也就是 1024 个可能的 5 个字母序列。您可以运行 KMP 1024 次。我不确定这是否有效(实际上,我确定这不是有效的)。该问题可以通过单次遍历数据和具有 1024 个条目的辅助数据结构来解决(线性时间,但使用的空间在模式长度上是指数级的,因此它不能很好地扩展到处理 10 个序列, 20, 100, … 个字符)。 OTOH,字符串较长的重复次数较少;使用稀疏哈希表?

标签: c input char realloc


【解决方案1】:

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

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

然后做同样的事情,但从第二个字符和五个字符开始。从第三个字符、第四个字符等中查找该子字符串。

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

会有很多循环,而且不是很有效,但应该会给你想要的结果。

【讨论】:

  • 我很想在“等等,直到你检查了整个字符串”之后添加诸如“理想情况下确保你不检查任何五个序列两次(尽管它会工作正常,因为第二次出现的次数会比第一次出现的次数少——只是有点浪费)'。
猜你喜欢
  • 2012-03-03
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多