Zeichenfolge spliten



  • Hallo Profis,

    ich habe ein kleines Problem und brauche dafür euere Hilfe.
    Ich habe einen String mit einer großen Bitfolge. z.B. so: 11000101010101111101000111 ect..

    Ich möchte den String einlesen, und nach jedem vierten Zeichen spliten.
    Folgenderweise:
    1100
    0101
    0101
    etc...

    Ich weiss, daß es nicht schwer ist. Aber ich weiss es nicht wie ich es am besten mache. Ob ich es mit substring machen soll, oder mit einem Array von char. Und das Problem ist auch, daß ich neu in C++ Programmierung bin.

    Wie macht ihr sowas?
    Ich bin für jeden Tipp dankbar.

    Gruß



  • Wofür willst du den String denn splitten?

    Ich würde substr() verwenden, um mir die einzelnen Teile herauszupicken:

    for(size_t start=0;start<text.len;start+=4)
      cout<<text.substr(start,4)<<endl;
    


  • Hallo CStoll,

    danke erstmal für deine schnelle Antwort.

    Ich will eigentlich folgendes tun:

    Meine Bitfolge befindet sich in einer Textdatei.

    Ich will die Bitfolge aus der Textdatei lesen, und sie nach jedem vierten Zeichen abschneiden. Wie ich es vorher beschrieben haben. Und diese als neue Datei abspeichern.

    D.h. die jetzige Datei sieht so aus:

    101010111000000100101010100101010110

    Die neue Datei soll so aussehen:

    1. 1010
    2. 1011
    3. 1000
    4. 0001
    5. 0010
    ect....

    Wie kriege ich das am besten hin?

    Gruß



  • Du kannst die Bitfolge blockweise aus der Datei auslesen (die Methode nennt sich read()*) und in die Zieldatei schreiben.

    char block[5]={0};//4 Byte plus \0
    int count=0;
    while(infile.read(block,4))
      outfile<<++count/*Zeilenzählung*/<<". "<<block<<endl;
    

    * Achtung: read() liefert keine Null-terminierten Strings, die mußt du also selber präperieren - im obigen Beispiel geschiet das, indem ich ein Byte zusätzlich reserviere und mit 0 initialisiere.



  • vielen Dank.

    Es funktioniert.

    Gruß



  • Hallo CStoll,

    ich habe für meine Aufgabe den Code

    for(size_t start=0;start<text.len;start+=4)
      cout<<text.substr(start,4)<<endl;
    

    verwendet.

    Nehmen wir an, die Datei hat folgende 2 Zeile:
    110010101
    0010101011110000110110

    Das Problem dabei ist folgendes:
    Lese ich Zeile pro Zeile, und splite ich nach jedem vierten Zeichen, bekomme ich nach dem spliten der ersten Zeile folgendes:
    1100
    1010
    1

    Und dieses '1' will ich nicht allein stehen haben, sondern direkt die folgende Zeile dran hängen.

    Am besten hätte ich alle Zeilen als ein einziger String.

    Wie kriege ich das hin?

    Wie lese ich alle Zeilen einer Datei, und sie alle aneinander hängen und als ein einziger String speichern?

    Diese letzte Frage geht an alle, die hier sind.

    Danke voraus.
    Gruß



  • Das wird ein wenig komplizierter: Du liest zeichenweise die Datei ein (get()) und verwirfst dabei alles, was dir nicht ins Konzept passt (NewLines, Leerzeichen,...), bevor du die Eingaben in ein Array (oder sogar einen std::string) packst. Wenn deine gewünschte Asnzahl erreicht ist, gibst du das Array aus und fängst wieder von vorne an.



  • Als Alternative zu den erwaehnten Arrays oder std::strings koenntest du auch eine std::deque oder std::queue<bool> benutzen, in die du die eingelesenen Bits mittels push/push_back eingibst und sie mittels pop/pop_front ausliest. Kleiner (pseudo-)beispielcode:

    istream is;
    queue<bool> q;
    char c;
    while (is.get(c)) {
      switch(c) {
        case '0': q.push(false); break;
        case '1': q.push(true); break;
        default: continue;
      }
    }
    
    ostream os;
    while(q.size()>=4) { //4er blocks
      os << (int)q.front(); q.pop();
      os << (int)q.front(); q.pop();
      os << (int)q.front(); q.pop();
      os << (int)q.front(); q.pop();
      os << endl;
    }
    while(!q.empty()) { //bis zu 3 restliche Zeichen
      os << (int)q.front(); q.pop();
    }
    os << endl;
    

    Diese variante liest erst die gesamte Datei in die queue und rotzt dann alles aus. Alternativ kann man auch Zeilenweise einlesen und dann ausgeben, bis die size der queue unter 4 geschrumpt ist, wieder einlesen usw. (und hoffen, dass die queue derweil nicht sinnlos dealloziert und neu alloziert)


Anmelden zum Antworten