2017-06-16 12 views
-3

Ich habe eine Zeichenfolge wie ATGCCA .... Diese Zeichenfolge wird in ein Array von Zeichen als [ATG CCA ...] umgewandelt. Ich weiß bereits, dass ATG = 1 und CCA = 2, und ich habe diese als doppelt definiert. Wie kann ich die transformierte Matrix als Double speichern? Hier ist mein Programm jetzt, aber es funktioniert nicht:Ist es möglich, ein Zeichen sowohl als Doppel als auch als Zeichen zu verwenden?

#include <iostream> 
#include <fstream> 
#include <string> 
#include <cstdlib> 
#include <cstdlib> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <math.h> 

using namespace std; 

int main() { 
double ATG=1, CCA=2; 

fstream fp("sequence.txt",ios::in); 
if(!fp) 
{ 
    cerr<<"File can not open!"<<endl; 
    exit(1); 
} 

char content,k,l,m; 
char a[4]=""; 
double n; 

while(fp>>k>>l>>m){ 
fp.read(a, sizeof(a) - 1); 
    n=atof(a); 
    cout<<a<<" "<<n<<endl; 
} 
} 

Ich erwarte, dass dies als Ausgabe sehen:

ATG 1 
CCA 2 

Aber was ich sehe, ist:

ATG 0 
CCA 0 

Thank Sie für Ihre Hilfe!

+1

_ "Ich weiß schon, dass ATG = 1 und CCA = 2 "_ Huh, was bitte? –

+0

'n = atof (a);': Es funktioniert nicht so. Sie müssen den Zeichenfolgenvergleich verwenden. Die relevanten Funktionen finden Sie in 'string.h' oder besser [' cstring'] (http://en.cppreference.com/w/cpp/header/cstring). Im Allgemeinen würde ich vorschlagen, ['std :: string'] (http://en.cppreference.com/w/cpp/string/basic_string) anstelle von' char * 'oder' char [] 'zu verwenden. 'std :: string' bietet Methoden zum Suchen oder Vergleichen von (Sub-) Strings. – Scheff

+0

Warum sollte 'n = atof (a)' Ihnen 1 geben, wenn a = 'ATG'? – Walter

Antwort

1

Es scheint, dass Sie einen String lesen, die "ATG" ist, und Sie erwarten atof dass als Name einer Variablen zu verwenden, von dem sein Wert zu extrahieren. Es gibt mehrere verkettete Fehler in dieser Argumentation.

Sie würden so etwas wie ein map (Code nicht getestet) benötigen:

#include <map> 
#include <string> 
#include <iostream> 
#include <fstream> 

using namespace std; 

int main() { 
    map<string, double> amino; 
    amino["ATG"] = 1; 
    amino["CCA"] = 2; 
    // ... Complete with the other 62 codons 

    fstream fp("sequence.txt",ios::in); 
    if(!fp) 
    { 
     cerr<<"File can not open!"<<endl; 
     exit(1); 
    } 

    char content, k, l, m; 
    char a[4]=""; 
    double n; 

    while(fp >> k >> l >> m) { 
    fp.read(a, sizeof(a) - 1); 
     n = amino[a]; 
     cout << a << " " << n << endl; 
    } 

    return 0; 
} 

Beachten Sie, dass Sie vielleicht int s statt double s verwenden. Und vielleicht einige Überprüfung, um sicherzustellen, dass die gelesenen Sequenzen tatsächlich Codons sind.

Möglicherweise müssen/wollen array für die Schlüssel der Kartenpaare verwenden, finden Sie

unsigned char array as key in a map (STL - C++)

Character Array as a value in C++ map

Using char* as a key in std::map

+0

Danke Sancho, Es war sehr hilfreich. –

4

Die Variablen ATG und CCA haben keine Beziehung auf irgendwelche Zeichen Sie lesen.

Sie wollen wahrscheinlich Strings verdoppelt zuzuordnen, für die Sie ein Associative Container benötigen, beispielsweise std::map<std::string, double>.

#include <iostream> 
#include <fstream> 
#include <string> 

int main() { 
    std::map<std::string, double> lookup = { { "ATG", 1}, { "CCA", 2 } }; 

    std::fstream fp("sequence.txt",std::ios::in); 
    if(!fp) 
    { 
     std::cerr<<"File can not open!"<<std::endl; 
     exit(1); 
    } 

    char content,k,l,m; 
    char a[4]=""; 
    double n; 

    while(fp>>k>>l>>m){ 
    fp.read(a, sizeof(a) - 1); 
     n=lookup[a]; 
     std::cout<<a<<" "<<n<<std::endl; 
    } 
} 
+0

Vielen Dank Caleth, Ja genau, ich wollte Strings zu Doubles zuordnen. –

Verwandte Themen