std::basic_stringbuf<CharT,Traits,Allocator>:: seekoff
|
protected
:
virtual
pos_type seekoff
(
off_type off,
|
||
Positioniert std::basic_streambuf::gptr und/oder std::basic_streambuf::pptr , falls möglich, an die Position, die exakt off Zeichen vom Anfang, Ende oder der aktuellen Position des Lese- und/oder Schreibbereichs des Puffers entspricht.
- Falls which std::ios_base::in enthält und dieser Puffer zum Lesen geöffnet ist (d.h. falls ( which & std:: ios_base :: in ) == std:: ios_base :: in ), dann wird der Lesezeiger std::basic_streambuf::gptr im Lesebereich wie unten beschrieben neu positioniert.
- Falls which std::ios_base::out enthält und dieser Puffer zum Schreiben geöffnet ist (d.h. ( which & std:: ios_base :: out ) == std:: ios_base :: out ), dann wird der Schreibzeiger std::basic_streambuf::pptr im Schreibbereich wie unten beschrieben neu positioniert.
- Falls which sowohl std::ios_base::in als auch std::ios_base::out enthält und der Puffer sowohl zum Lesen als auch zum Schreiben geöffnet ist (d.h. ( which & ( std:: ios_base :: in | std:: ios_base :: out ) ) == ( std:: ios_base :: in | std:: ios_base :: out ) ) und dir entweder std::ios_base::beg oder std::ios_base::end ist, dann werden sowohl Lese- als auch Schreibzeiger wie unten beschrieben neu positioniert.
- Andernfalls schlägt diese Funktion fehl.
Wenn gptr und/oder pptr neu positioniert werden, geschieht dies wie folgt:
off_type
wird bestimmt
Inhaltsverzeichnis |
Parameter
| off | - | relative Position, auf die der/die nächste(n) Zeiger gesetzt werden soll | ||||||||
| dir | - |
definiert die Basisposition, auf die der relative Offset angewendet wird. Es kann eine der folgenden Konstanten sein:
|
||||||||
| which | - |
definiert, ob die Eingabesequenz, die Ausgabesequenz oder beide betroffen sind. Es kann eine oder eine Kombination der folgenden Konstanten sein:
|
Rückgabewert
pos_type
(
newoff
)
bei Erfolg,
pos_type
(
off_type
(
-
1
)
)
bei Fehler oder wenn
pos_type
die resultierende Stream-Position nicht darstellen kann.
Beispiel
#include <iostream> #include <sstream> int main() { std::stringstream ss("123"); // in/out std::cout << "put pos = " << ss.tellp() << " get pos = " << ss.tellg() << '\n'; // absolute positioning both pointers ss.rdbuf()->pubseekoff(1, std::ios_base::beg); // move both 1 forward std::cout << "put pos = " << ss.tellp() << " get pos = " << ss.tellg() << '\n'; // try to move both pointers 1 forward from current position if (-1 == ss.rdbuf()->pubseekoff(1, std::ios_base::cur)) std::cout << "moving both pointers from current position failed\n"; std::cout << "put pos = " << ss.tellp() << " get pos = " << ss.tellg() << '\n'; // move the write pointer 1 forward, but not the read pointer // can also be called as ss.seekp(1, std::ios_base::cur); ss.rdbuf()->pubseekoff(1, std::ios_base::cur, std::ios_base::out); std::cout << "put pos = " << ss.tellp() << " get pos = " << ss.tellg() << '\n'; ss << 'a'; // write at put position std::cout << "Wrote 'a' at put position, the buffer is now " << ss.str() << '\n'; char ch; ss >> ch; std::cout << "reading at get position gives '" << ch << "'\n"; }
Ausgabe:
put pos = 0 get pos = 0 put pos = 1 get pos = 1 moving both pointers from current position failed put pos = 1 get pos = 1 put pos = 2 get pos = 1 Wrote 'a' at put position, the buffer is now 12a reading at get position gives '2'
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 55 | C++98 |
seekoff
lieferte eine undefinierte
ungültige Stream-Position bei Fehler |
pos_type
(
off_type
(
-
1
)
)
wird bei Fehler zurückgegeben |
| LWG 375 | C++98 |
Statische Konstantenmember von
std::ios_base
waren
fälschlicherweise als Member von std::basic_ios spezifiziert |
korrigiert |
| LWG 432 | C++98 |
seekoff
könnte erfolgreich sein, selbst wenn
newoff
+
off
über den letzten initialisierten Zeiger zeigen würde |
seekoff
schlägt
in diesem Fall fehl |
| LWG 453 | C++98 |
Neupositionierung von null
gptr
(
)
und/oder null
pptr
(
)
mit einem neuen Offset von null schlug immer fehl |
kann in diesem Fall erfolgreich sein |
| LWG 563 | C++98 |
Der Endzeiger konnte nicht zur Berechnung von
newoff
verwendet werden, da er
nach der Lösung von LWG Issue 432 nicht präzise vom Programm gesteuert werden konnte |
Verwende stattdessen den
High-Watermark-Zeiger |
Siehe auch
|
ruft
seekoff
(
)
auf
(öffentliche Elementfunktion von
std::basic_streambuf<CharT,Traits>
)
|
|
|
[virtual]
|
positioniert den nächsten Zeiger in der Eingabesequenz, Ausgabesequenz oder beiden mittels absoluter Adressierung neu
(virtuelle geschützte Elementfunktion) |
|
[virtual]
|
positioniert die Dateiposition mittels relativer Adressierung neu
(virtuelle geschützte Elementfunktion von
std::basic_filebuf<CharT,Traits>
)
|
|
[virtual]
|
positioniert den nächsten Zeiger in der Eingabesequenz, Ausgabesequenz oder beiden mittels relativer Adressierung neu
(virtuelle geschützte Elementfunktion von
std::strstreambuf
)
|