std::basic_stringbuf<CharT,Traits,Allocator>::seekoff
Von cppreference.com
< cpp | io | basic stringbuf
| protected: virtual pos_type seekoff( off_type off, |
||
Positioniert std::basic_streambuf::gptr und/oder std::basic_streambuf::pptr, wenn möglich, an die Position, die genau off Zeichen vom Anfang, Ende oder der aktuellen Position des Lese- und/oder Schreibbereichs des Puffers entspricht.
- Wenn which std::ios_base::in enthält und dieser Puffer zum Lesen geöffnet ist (d. h. wenn (which & std::ios_base::in) = std::ios_base::in), dann wird der Lesezeiger std::basic_streambuf::gptr innerhalb des Lesegebiets wie unten beschrieben neu positioniert.
- Wenn 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 innerhalb des Schreibgebiets wie unten beschrieben neu positioniert.
- Wenn which sowohl std::ios_base::in als auch std::ios_base::out enthält und der Puffer sowohl für das Lesen als auch für das 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 der Lese- als auch der Schreibzeiger wie unten beschrieben neu positioniert.
- Andernfalls schlägt diese Funktion fehl.
Wenn gptr und/oder pptr neu positioniert werden, geschieht dies wie folgt:
1) Der neue Zeigerversatz newoff vom Typ
off_type wird bestimmt:b) Wenn dir = std::ios_base::cur, dann ist newoff die aktuelle Position des Zeigers (gptr() - eback() oder pptr() - pbase()).
c) Wenn dir = std::ios_base::end, dann ist newoff die Länge des gesamten initialisierten Teils des Puffers (wenn Überlaufzuweisung verwendet wird, der High-Watermark-Zeiger minus dem Anfangszeiger).
2) Wenn der neu zu positionierende Zeiger ein Nullzeiger ist und newoff nicht null wäre, schlägt diese Funktion fehl.
3) Wenn newoff + off < 0 (die Neupositionierung würde den Zeiger vor den Anfang des Puffers verschieben) oder wenn newoff + off über das Ende des Puffers hinaus zeigen würde (oder über das letzte initialisierte Zeichen im Puffer hinaus, wenn Überlaufzuweisung verwendet wird), schlägt die Funktion fehl.
4) Andernfalls wird der Zeiger zugewiesen, als ob durch gptr() = eback() + newoff + off oder pptr() = pbase() + newoff + off.
Inhalt |
[bearbeiten] Parameter
| off | - | relativer Positionsversatz, auf den die nächsten Zeiger gesetzt werden sollen. | ||||||||
| dir | - | definiert die Basisposition, auf die der relative Offset angewendet wird. Es kann eine der folgenden Konstanten sein
| ||||||||
| which | - | legt fest, ob die Eingabesequenzen, die Ausgabesequenz oder beide betroffen sind. Es kann eine oder eine Kombination der folgenden Konstanten sein:
|
[bearbeiten] Rückgabewert
pos_type(newoff) bei Erfolg, pos_type(off_type(-1)) bei Fehlschlag oder wenn pos_type die resultierende Stream-Position nicht darstellen kann.
[bearbeiten] Beispiel
Führen Sie diesen Code aus
#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'
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 55 | C++98 | seekoff gab einen undefiniertenungültige Stream-Position bei Fehler |
pos_type(off_type(-1)) wird bei Fehler zurückgegeben. |
| LWG 375 | C++98 | statische konstante Member von std::ios_base waren falsch als Member von std::basic_ios spezifiziert. |
korrigiert |
| LWG 432 | C++98 | seekoff könnte erfolgreich sein, auch wenn newoff + offüber das letzte initialisierte Zeichen hinaus zeigen würde. |
seekoff schlägt fehl.in diesem Fall |
| LWG 453 | C++98 | Neupositionierung von Null gptr() und/oder Null pptr() mit einem neuen Offset von null schlug immer fehl. |
Es kann in diesem Fall erfolgreich sein. |
| LWG 563 | C++98 | Der Endzeiger konnte nicht zur Berechnung von newoff verwendet werden, da er nach der Auflösung von LWG Issue 432 nicht präzise vom Programm gesteuert werden konnte. |
Verwenden Sie stattdessen den High-Watermark- Zeiger. |
[bearbeiten] Siehe auch
| ruft seekoff() auf (öffentliche Member-Funktion von std::basic_streambuf<CharT,Traits>) | |
| [virtuell] |
positioniert den nächsten Zeiger in der Eingabesequenz, Ausgabesequenz oder beidem neu, unter Verwendung absoluter Adressierung (virtuelle geschützte Memberfunktion) |
| [virtuell] |
positioniert die Dateiposition neu, unter Verwendung relativer Adressierung (virtuelle protected Member-Funktion von std::basic_filebuf<CharT,Traits>) |
| [virtuell] |
positioniert den nächsten Zeiger in der Eingabesequenz, Ausgabesequenz oder beidem neu, unter Verwendung relativer Adressierung (virtuelle protected Member-Funktion von std::strstreambuf) |