StringStream: Format übertragen



  • Hallo Community,

    ich habe gestern nach einer C++-Alternative für "sscanf" gesucht und bin bei Stringstreams hängen geblieben.

    Mein Problem:

    Ich habe einen String vom Format "String Zahl Zahl Zahl".
    Nun möchte ich die drei Zahlen übertragen und den anfänglichen String einfach ignorieren.

    Mein bisheriger Ansatz sieht wie folgt aus:

    stringstream hLine("asdf 1 2 3");
    
    int a = 0;
    int b = 0;
    int c = 0;
    
    hLine >> a >> b >> c;
    

    Jedoch klappt das nur wenn der anfänglich Text nicht dort ist.

    Meine Frage:
    Wie kann ich den anfänglichen Teil ignorieren?

    Ich hoffe mal ich habe keinen blöden Denkfehler oder habe einen anderen Artikel zu dem Thema übersehen.

    Mit freundlichen Grüßen,

    Atgoogat



  • Atgoogat schrieb:

    Hallo Community,

    ich habe gestern nach einer C++-Alternative für "sscanf" gesucht und bin bei Stringstreams hängen geblieben.

    stringstream hLine("asdf 1 2 3");
    
    string dummy;
    
    int a = 0;
    int b = 0;
    int c = 0;
    
    hLine >> dummy >> a >> b >> c;
    

    t


  • Mod

    Welches Format hat String? Wenn es keinen Leerraum beinhaltet:

    while (hLine && not std::isspace((unsigned char)hLine.get()));
    

    Edit: War wohl doch ein wenig komplizierter als gedacht... 😃



  • Danke für die schnellen Antworten!

    Belli: Deine Möglichkeit funktioniert aber irgendwie wirkt das ein wenig wie nicht so geplannt. Gibt es dafür keine Platzhalter oder ähnliches? Trotzdem danke sehr!

    Arcoth: 'String' hat keinen Leerraum also wäre das eine Option jedoch würde ich dann eher mit der Lösung von Belli fahren da diese einfach zu Händeln ist.



  • Hallo Atgoogat,
    falls sicher ist, dass es sich bei dem Zeichen vor der Zahl um ein Leerzeichen handelt, kann man auch alles bis dorthin überlesen:

    #include <iostream>
    #include <sstream>
    
    int main()
    {
        using namespace std;
        stringstream hLine("asdf 1 2 3");
        int a, b, c;
        if( hLine.ignore( 9999, ' ' ) >> a >> b >> c )
            cout << "Gelesen: a=" << a << " b=" << b << " c=" << c << endl;
    }
    

    Gruß
    Werner



  • Klasse!

    Ja es ist immer ein Leerzeichen dort also werde ich jetzt diese Lösung verwenden.

    Vielen Dank für alle Antworten!


Anmelden zum Antworten