Escape Sequenzen aus InputStream filtern
-
Hallo,
Ein Programm soll Texte auf ein LCD-Display ausgeben.
Mein Problem: Das Display wird mit der Escape Sequenz \a gelöscht. Wenn die Escape Sequenz in einem String steckt "bla bla \a bbla bla" wird sie vom Display Treiber ignoriert, da die Escape Sequenz ja nicht in ein einzelnes char umgewandelt sondern als Zeichen '\' und 'a' dem Treiber übergeben wird.
Wie kann ich den File-Out Stream auf die Escape Zeichen filtern und diese als einzelne Zeichen dem Treiber überreichen?Die Funktion sieht so aus:
int lcdPrintf(const char* msg) { filestr << msg; if (filestr.fail()) { cerr << " Could not write to LCD" << endl; return -1; } return 0; }Ich hab's mit outstringstream versucht. Nur kennt dieser die Methode ignore() nicht. Ich muss den String entgegennehmen, bearbeiten und dann an den File-Stream senden.
Wer kann mir da weiterhelfen?
-
maus_on_c schrieb:
Ich muss den String entgegennehmen, bearbeiten und dann an den File-Stream senden.
Das isses doch schon. std::string hat ne Menge Methoden zum verwursteln, z.B. zum finden und ausschnibbeln von substrings etc.
http://www.cplusplus.com/reference/string/string/
beachte z.B. die find-Methoden.
-
so in etwas würd es mir gefallen.
char* s = "Hello\nworld"; string converted; while(*s) { if ( *s == '\\' ) { s++; switch (*s) { case 'a': converted += 7; break; case 'n': converted += 10; break; // more stuff } } else { converted += *s; } s++; }
-
Danke ConvertOr. So gefällts auch mir sehr
!!Die Methode hat beinahe ihren End-Zustand erreicht. Sie sieht mittlerweile so aus:
int lcdPrintf(const char format[], ...) { // Get variable arguments char* s = (char*) malloc(80 * sizeof(char)); va_list arg; int done; va_start(arg, format); // compile String done = vsprintf(s, format, arg); // Set Terminator s[done] = 0; while (*s) { if (*s == '\\') { s++; switch (*s) { case 'a': filestr.put('\a'); break; case 'n': filestr.put('\n'); break; case 'r': filestr.put('\r'); break; } } else { filestr << *s; } s++; } filestr.flush(); if (filestr.fail()) { cerr << " Could not write to the LCD" << endl; // free(s); // hier gibt's ein Segfault return -1; } //free(s); // hier gibt's ein Segfault return 0; }Die Methode kann nun à la printf einen Format-Vektor wiedergeben. filestr.flush() muss sein, um den filestream ohne newline zur Ausgabe zu zwingen.
Was mich jetzt noch beschäftigt: Ich habe gelernt, dass man alle Variablen, welche man mit malloc() alloziert hat, gefälligst mit free() wieder de-allozieren soll. Warum geben die free()-Aufrufe in der Methode oben einen Segmentation fault?
-
maus_on_c schrieb:
Was mich jetzt noch beschäftigt: Ich habe gelernt, dass man alle Variablen, welche man mit malloc() alloziert hat, gefälligst mit free() wieder de-allozieren soll. Warum geben die free()-Aufrufe in der Methode oben einen Segmentation fault?
Wegen "s++". Du übergibst an free() überhaupt nicht mehr die Adresse, die dir malloc() geliefert hat. Armes malloc()

Stefan.
-
ach ja. Vergesst meine letzte Frage. Da ich den Pointer mehrmals inkrementiert habe, kann ich mit dem Pointer als Parameter kein free() mehr aufrufen.
Lösung: Entweder eine Copy des Pointers zu Beginn der Methode erstellen oder eine separate Inkrementiervariable dem Pointer hinzufügen (*ptr + ++i) .