konvertierung von String to char[][]



  • Hallo,

    ich hab ein realativ simples Problem, ich steig aber nicht dahinter wie ich es lösen soll. Ich habe eine Datei die so aufgebaut ist (fastq file):

    @r0
    CAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCT
    +
    EDCCCBAAAA@@@@?>===<;;9:99987776554A
    @r1
    AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTC
    +
    EDCCCBAAAA@@@@?>===<;;9:999877765540
    

    Soweit so gut. die Länge der Zeilen mit @r kann varieren deswegen lese ich die Datei zeilenweise als String ein:

    fstream myfastqfile("filename");
    
    		int c = 0;
    
    		if(myfastqfile.is_open()){
    
    			while(myfastqfile.good()){
    				getline(myfastqfile, _names[c]);
    
    				string seqtemp;
    				string garbage; // # Zeile wird weggeschmissen
    				string phredtemp;
    
    				getline(myfastqfile, seqtemp);
    				getline(myfastqfile, garbage);
    				getline(myfastqfile, phredtemp);
    
    				for(int k=0; k<SRLENGTH; k++){
    					[b]_seqs[c] = seqtemp.c_str();[/b]
                                            [b]_phreds[c] = phredtemp.c_str();[/b]
    				}
    				c++;
    			}
    

    Das Problem liegt in fett geschriebenen Zeile. Ich brauche diese (immer gleichlangen) Zeilen in einem char Array. Das hab ich 2 dimensional definiert:

    char *_seqs;
    _seqs = (char *) new char[_filelength][SRLENGTH];
    

    wobei SRLENGTH die fixe Länge der Zeilen 2 und 4 ist und _filelength die Anzahl der Einträge (jeweils 4 Zeilen). Auch ein

    _seqs[c][k] = seqtemp.at(k);
    

    hat nichts gebracht (error: invalid conversion from ‘const char*’ to ‘char’).

    Hat jemand einen Vorschlag?



  • Erstmal hast du mit deinem Cast zwar den Compiler ruhig gestellt, dafür geht das restliche Programm davon aus, ein normales eindimensionales Array zu haben.

    Zweitens hast du ein Problem mit der Tatsache, daß c_str() einen temporären Wert zurückgibt, der irgendwann nicht mehr gültig ist und überschrieben wird. Du müsstest dir ein eigenes char-Array resevieren und die Daten dort reinkopieren.

    Drittens: Ist es unbedingt notwendig, mit nackten char-Arrays zu hantieren? Wenn möglich, solltest du stattdessen lieber einen std::vectorstd::string verwenden.



  • Erstmal danke für die Antwort.

    Zu 1.: Das wäre ja nicht weiter schlimm da ich die Position im eindimmensionalen je genau feststellen kann da die einzelnen Zeilen genau in ihrer Länge definiert sind.

    Zu 3.: Die Daten aus den char Arrays werden danach auf der Grafikkarte weiterverarbeitet, leider kann ich dort weder string noch vector nutzen (außerdem habe ich den GK schon geschrieben).

    Danke,
    mfg mic



  • [mic] schrieb:

    Erstmal danke für die Antwort.

    Zu 1.: Das wäre ja nicht weiter schlimm da ich die Position im eindimmensionalen je genau feststellen kann da die einzelnen Zeilen genau in ihrer Länge definiert sind.

    Das wäre insofern schlimm als dass du nicht im Code schreibst was du wirklich tust, obwohl du das könntest. Du bescheißt damit nicht nur den Compiler, sondern auch jeden, der den Code später mal lesen können soll (einschließlich dir selbst in ein paar Wochen/Monaten).

    malloc ist richtig, wenns unbedingt C-strings sein sollen. Den Rest erledigt dann strcpy für dich.

    Je nachdem was deine Grafikkarte verwursten muss, solltest du das eindimensionale Array auch als solches befüllen, wobei ich dann trotzdem std::vector<char> benutzen würde, den kann man problemlos konvertieren mittels

    char* ptr = &(vec[0]); //C++03
    char* ptr = vec.data(); //C++0x
    

    Oder eben ein zweidimensionales Array auch als solches definieren.



  • Danke, der Tip mit Vector hat gut funktioniert.


Log in to reply