fstreams und putback?



  • Hallo, ich habe mir einen kleinen Tokenizer für Config Files geschrieben.
    Leider macht mir hier die putback Funktion schwer zu schaffen.
    Wenn ich versuche Zeichen, die ich eingelesen habe wieder in den Stream zu stecken scheitert das kläglich und es wird beim nächsten Aufruf einfach nicht das zuletzt hineingesteckte Zeichen bearbeitet.

    Hier der Code

    tokentype parser::parse_token()
    {
            TokenType=CLEAN;
            string keywords[]={"{",
                               "}",
                               "/*",
                               "*/",
                               "//",
                               ",",
                               "\n"}; // Basic keywords
            string Tag="";
            string buf="";
            char ch;
            bool delimfound=false;
            while (stream.get(ch) && (!delimfound))  <---- Hier ist der Fehler
            {
                    Tag+=ch;
                    // cout << ":" << ch << endl;
                    for (int i=0; i<sizeof(keywords)/sizeof(string); i++)
                    {
                            string back="";
                            int pos=Tag.find(keywords[i]);
                            if (pos!=string::npos) {
                                    int len=keywords[i].length();
                                    if (Tag.length()!=len){               // delimiter splits here our token otherwise we would only have the delimiter processed
                                            back=Tag.substr(pos, len);
                                            Tag.erase(pos, len);
                                            for (int i=0; i<len; i++){
                                                    stream.putback(back.c_str()[i]);
                                                    cout << "zurueck" << back << " Tag=" << Tag << endl;
                                            }
                                    } // else cout << int(ch) << endl;
                                    delimfound=true;
                                    break;
                            }
                    }
    
            }
            // stream.putback('!');
            TokenString=Tag;
            if (Tag.length()>0) cout << Tag << endl;
            return OTHER;
    }
    

    tokentype usw sind einfach nur enums
    In Zeile 30 stecke ich Zeichen zurück wenn ich merke das diese zum nächsten Token gehören sollten

    stream ist dabei ein fstream
    Wenn ich das cout in Zeile 18 auskommentiere bringt er mir allerdings nicht das von 167 hineingesteckte Zeichen beim nächsten aufruf zurück.

    Woran könnte das liegen



  • Ich bin mir nicht sicher, ob du die Zeichen in der richtigen (sprich: umgekehrten) Reihenfolge zurück in den Stream steckst.



  • MFK schrieb:

    Ich bin mir nicht sicher, ob du die Zeichen in der richtigen (sprich: umgekehrten) Reihenfolge zurück in den Stream steckst.

    Ne ich hab ihn schon gefunden.
    Der war mies. Die Reihenfolge von der while Bdeingung wird ja von links nach rechts ausgewertet.
    Ich musste die delimiter Bedingung natürlich vor der stream.get(ch) Bedingung auswerten lassen, sonst wird auf jeden fall noch ein Zeichen gelesen.
    In diesem Fall war dies mein zurückgestecktes Zeichen...

    Ne richtige Kopfnuss



  • Die vom Standard garantierte Größe des Putback-Buffers ist 1. Wenn du mehr brauchst, mußt du dir einen eigenen Buffer schreiben.



  • Z2 schrieb:

    Die vom Standard garantierte Größe des Putback-Buffers ist 1. Wenn du mehr brauchst, mußt du dir einen eigenen Buffer schreiben.

    Was heißt dass denn?
    Das ich nicht mehr als ein Zeichen zurück in den Stream schicken kann?
    Das kanns doch nicht sein oder?



  • Es ist möglich, daß deine Implementierung der STL mehr als ein Zeichen zuläßt. Das ist aber eben implementierungsabhängig. Wenn du portabel bleiben willst, bist du auf ein Zeichen beschränkt.


Anmelden zum Antworten