2016-04-12 8 views
-1

Ich habe eine Datei einer DNA-Sequenz (A's, T's, G's und C's); Es hat keine Leerzeichen, Kommas oder Zeilentrennzeichen. Ich muss die ersten 10.000 Werte daraus lesen und die zwei fünfwertigen Muster finden, die am häufigsten wiederholt werden.Wie liest man eine Datei nach Gruppen von Zeichen in C?

Bisher habe ich versucht, wie dies die unterschiedlichen Muster in einer einfachen Struktur zu speichern:

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

und wie ich finde immer neue Muster, die ich sie durch den folgenden Zyklus speichern:

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++; 
    } 
} 

jedoch Mein Code ist falsch und gibt mir eine segmentation fault Fehler , wenn ich es ausführen, bitte helfen Sie mir aus.

+0

http://en.cppreference.com/w/c/io/fread –

+2

Nun, wir können Ihnen keine Antwort geben, die Sie mit der Programmierung in C vertraut macht. Sie müssen ein bestimmtes Niveau erreichen und danach fragen Fragen zu bestimmten Problemen, denen Sie begegnen. Wir können Ihnen nicht so helfen! –

+0

@JohnnyMopp das ist C++ Referenz, nicht C. Ich würde lieber OP auf "Mann Fread". –

Antwort

1

Zuerst lesen Sie alle 10000 Werte in den Speicher, dann nur auf den In-Memory-Daten arbeiten.

Zum Suchen von Sequenzen ist es im Grunde einfache Sub-String-Suche. Eine naive Lösung besteht darin, mit den ersten fünf Zeichen zu beginnen und dann nach dem gleichen Teilstring vom zweiten Zeichen, dann vom dritten Zeichen, dann vom vierten Zeichen und so weiter zu suchen. Zählen Sie, wie oft die Teilzeichenfolge gefunden wurde.

Dann dasselbe tun, aber mit dem zweiten Zeichen und fünf Zeichen vorwärts beginnen. Suchen Sie nach dem Teilzeichenfolgezeichen vom dritten Zeichen, dem vierten Zeichen und so weiter.

Nach den zwei ersten Suchen haben Sie zwei Zählungen, eine große und eine kleine. Wenn Sie bei den nächsten Suchen eine Teilzeichenfolge finden, die eine größere Anzahl als die beiden aktuellen Zeichenfolgen enthält, löschen Sie die kleinste und speichern Sie die aktuelle Teilzeichenfolge (und ihre Anzahl). Und so weiter, bis Sie die ganze Zeichenfolge überprüft haben.

Es wird eine Menge von Schleifen sein, und nicht sehr effektiv, aber sollte Ihnen das gewünschte Ergebnis geben.

+1

Ich war versucht, nach 'Und so weiter, bis Sie die gesamte Zeichenfolge' Wörter wie 'im Idealfall stellen Sie sicher, dass Sie keine Folge von fünf zweimal überprüfen (obwohl es OK funktioniert, da das zweite Vorkommen wird kleiner haben zählen als das erste Vorkommen - es wäre nur ein wenig verschwenderisch). –