Ungültige, nicht-Ascii-Zeichen aus String entfernen?



  • Hallo,

    ich lese eine Textdatei per

    while(fgets(tmp, 1024, file) != NULL)
    

    Zeilenweise ein und verarbeite diese dann. Allerdings will ich diese dann wieder ausgeben (auf einer gtk-Oberfläche). Das funktioniert zwar, aber ich bekomme am Ende ein komisches Zeichen, das nicht dargestellt werden kann. Kann leider keinen Screenshot machen, aber das habt ihr sicher alle schonmal gesehen: So ein viereckiges kästchen, indem sich vier komischen Zeichen befinden.

    Ich hoffe mal, ihr wisst was ich meine. Ich bin mir nicht ganz sicher, woran das liegt. Durch fgets werden ja 1024 Zeichen eingelesen, vielleicht steht das für diese große Menge an leerzeichen, mit denen Gtk dann Probleme bei der anzeige bekommt, ich weiß es nicht.

    Die Frage ist jetzt, wie bekomme ich das weg? Würde es reichen, die Leerzeichen zu löschen oder wofür steht das überhaupt?

    Danke schonmal.

    P.S. Ich habe hier ein Debian Linux mit gcc und gtkmm.



  • Hat denn niemand eine Antwort?

    Leerzeichen entferne ich mittlerweile per

    std::remove(str.begin(), str.end(), ' ');
    

    aber diese komischen Sonderzeichen oder was auch immer das ist, sind immer noch da. 😞



  • Ich tipp mal auf den doppelten Windows-Zeilenumbruch. Wieso benutzt du nicht streams statt fgets?



  • Ob es nun Möglicheiten gibt, zu verhindern, dass "komische Sonderzeichen" überhaupt in den string wandern, kann ich nicht beurteilen.
    Aber wenn du den Weg der nachträglichen Entfernung beschreiten willst, würde ich diesen Weg:

    user666 schrieb:

    ...
    Leerzeichen entferne ich mittlerweile per

    std::remove(str.begin(), str.end(), ' ');
    

    ...

    weiterverfolgen und mit remove_if() und isprint() und/oder isspace() etwas basteln.
    Falls das nicht reicht, kannst du auch eine eigene Vergleichsfunktion bauen (die dann aus einer selbsterstellten konstanten Liste raussucht).

    Gruß,

    Simon2.



  • Und dann noch darauf achten was remove_if wirklich macht. Wenn die Zeichen wirklich gelöscht werden sollen den Rückgabewert von remove_if für string::erase (oder welchen Container du halt benutzt) verwenden. Oder den Text eben nur bis zum zurückgebenen Iterator ausgeben.



  • Hmmm - da das bei std::remove() genauso ist, hielt ich das nicht für besonders erwähnenswert. Aber sicher ist sicher.

    Gruß,

    Simon2.



  • Er wunderte sich ja, dass bei remove seine Zeichen immer noch da sind. Sie werden halt nicht gelöscht sondern nur nach hinten geschoben.


Log in to reply