gpt4 book ai didi

c - 如何在C中按字符组读取文件?

转载 作者:行者123 更新时间:2023-11-30 19:12:42 25 4
gpt4 key购买 nike

我有一个 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 failure错误当我执行它时,请帮助我。

最佳答案

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

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

然后执行相同的操作,但从第二个字符和前面的五个字符开始。从第三个字符、第四个字符等查找该子字符串。

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com