Namespaces
Variants

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

From cppreference.net
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 , 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.

Wenn gptr und/oder pptr neu positioniert werden, geschieht dies wie folgt:

1) Der neue Zeiger-Offset newoff vom Typ off_type wird bestimmt
a) wenn dir == std:: ios_base :: beg , dann ist newoff null
b) falls 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 (falls Over-Allocation verwendet wird, der High-Watermark-Zeiger minus dem Anfangszeiger)
2) Wenn der neu zu positionierende Zeiger ein Nullzeiger ist und newoff ungleich 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, falls Over-Allocation 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 .

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:
Konstante Erklärung
beg der Anfang eines Streams
end das Ende eines Streams
cur die aktuelle Position des Stream-Positionsindikators
which - definiert, ob die Eingabesequenz, 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

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 )