我有一个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/