Namensräume
Varianten
Aktionen

std::basic_stringbuf<CharT,Traits,Allocator>::seekoff

Von cppreference.com
< cpp‎ | io‎ | basic stringbuf
 
 
 
 
protected:

virtual pos_type seekoff( off_type off,
                          std::ios_base::seekdir dir,

                          std::ios_base::openmode which = std::ios_base::in | std::ios_base::out );

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 gptr und/oder pptr neu positioniert werden, geschieht dies wie folgt:

1) Der neue Zeigerversatz newoff vom Typ off_type wird bestimmt:
a) Wenn dir = std::ios_base::beg, dann ist newoff null.
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
Konstante Erklärung
beg der Anfang eines Streams
end das Ende eines Streams
cur die aktuelle Position des Stream-Positionsanzeigers
which - legt fest, ob die Eingabesequenzen, die Ausgabesequenz oder beide betroffen sind. Es kann eine oder eine Kombination der folgenden Konstanten sein:
Konstante Erklärung
in beeinflusst die Eingabesequenz
out beeinflusst die Ausgabesequenz

[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

#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 undefinierten
ungü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>) [bearbeiten]
[virtuell]
positioniert den nächsten Zeiger in der Eingabesequenz, Ausgabesequenz oder beidem neu, unter Verwendung absoluter Adressierung
(virtuelle geschützte Memberfunktion) [bearbeiten]
[virtuell]
positioniert die Dateiposition neu, unter Verwendung relativer Adressierung
(virtuelle protected Member-Funktion von std::basic_filebuf<CharT,Traits>) [edit]
[virtuell]
positioniert den nächsten Zeiger in der Eingabesequenz, Ausgabesequenz oder beidem neu, unter Verwendung relativer Adressierung
(virtuelle protected Member-Funktion von std::strstreambuf) [edit]