tellg, seekg



  • Bin nach der Wochenendarbeit anscheinend zu dull im Kopf:

    Folgender Code soll aus ner String-Variable, nach dem Format Text+Zahl den Text und die Zahl rausholen:

    std::string
        strTypeAndIndex("T1");
    
         std::stringstream
        strm;
    
        strm << strTypeAndIndex;
    
         std::stringstream
        strmTyp;
    
         char
        chLetter('\0');
    
        strm.get(chLetter);
    
        for(  unsigned                      //solange
             u(0);
             strTypeAndIndex.size() > u     //nicht am Ende vom String
             && std::isalpha(chLetter);     //und alpha-nummerisch
             ++u,
             strm.get(chLetter))
        {
          strmTyp << chLetter;              //"T"
        }                                    
    
         std::string
        str( strmTyp.str());
    
        strm.seekg(-1, strm.tellg());     // geh eins zurück im Stream
    
         int
        iParIndex(0);
    
        strm >> iParIndex;                //lies die Zahl
    

    Das klappt wunderbar, solange in strm zwei Buchstaben drin sind. Sobald das aber 3 sind, funzt
    strm.seekg(-1, strm.tellg());
    nicht mehr. Der Positionszeiger ändert sich garnicht.



  • Ersetze mal

    strm.seekg(-1, strm.tellg());

    durch

    strm.seekg(-1, ios::cur);



  • Lass Dich knuddeln! Damit gehts.

    komischerweise funzt bei mir aber noch nicht mal folgender 3-Zeiler:

    std::stringstream
    strm;

    strm << "01234";

    strm.seekg(3);

    strm.tellg() sagt auch nach der letzten Zeile, dass es an Position 0 ist ????



  • Oha,

    mal doof gefragt: Ist das beim strstream erlaubt bzw. hat der random zugrif ?

    Ich meine nach befüllen des streams stehst Du doch am ende des streams. Wie willst da noch 3 Zeichen weiter ?

    12345|ABC

    | = Ende
    C = da wo Du hinwillst



  • die ein-parameter-Version von seekg bekommt eine Position, nicht den offset zur aktuellen Position. Oder versteh ich da was falsch???



  • Ja, die Position.

    istream::seekg
    istream& seekg( streampos pos );
    istream& seekg( streamoff off, ios::seek_dir dir );

    Parameters
    pos
    The new position value; streampos is a typedef equivalent to long.

    off
    The new offset value; streamoff is a typedef equivalent to long.

    dir
    The seek direction. Must be one of the following enumerators:
    ios::beg Seek from the beginning of the stream.
    ios::cur Seek from the current position in the stream.
    ios::end Seek from the end of the stream.



  • seek direction 💡
    Da kann man natürlich nicht einfach ne Position angeben

    Und ich hab extra nochmal nachgelesen ...

    Danke Euch!


Anmelden zum Antworten