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 angebenUnd ich hab extra nochmal nachgelesen ...
Danke Euch!