Namespaces
Variants

std::strstreambuf:: seekoff

From cppreference.net
protected :

virtual pos_type seekoff ( off_type off,
ios_base :: seekdir way,

ios_base :: openmode which = ios_base :: in | ios_base :: out ) ;
(in C++98 veraltet)
(in C++26 entfernt)

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 sowohl ios_base :: in enthält und dieser Puffer zum Lesen geöffnet ist, wird der Lesezeiger std::basic_streambuf::gptr im Lesebereich wie unten beschrieben neu positioniert.
  • Falls which sowohl ios_base :: out enthält und dieser Puffer zum Schreiben geöffnet ist, wird der Schreibzeiger std::basic_streambuf::pptr im Schreibbereich wie unten beschrieben neu positioniert.
  • Falls which sowohl ios_base :: in als auch ios_base::out enthält und der Puffer sowohl zum Lesen als auch zum Schreiben geöffnet ist, und way entweder ios_base :: beg oder ios_base :: end ist, werden sowohl Lese- als auch Schreibzeiger wie unten beschrieben neu positioniert.
  • Andernfalls schlägt diese Funktion fehl.

Wenn der Zeiger (entweder gptr oder pptr oder beide) neu positioniert wird, geschieht dies wie folgt:

1) Wenn der neu zu positionierende Zeiger ein Nullzeiger ist und der neue Offset newoff ungleich Null wäre, schlägt diese Funktion fehl.
2) Der neue Zeiger-Offset newoff vom Typ off_type wird bestimmt
a) wenn way == ios_base :: beg , dann ist newoff null
b) falls way == ios_base :: cur , dann ist newoff die aktuelle Position des Zeigers ( gptr ( ) - eback ( ) oder pptr ( ) - pbase ( ) )
c) wenn way == ios_base :: end , dann ist newoff die Länge des gesamten initialisierten Teils des Puffers (wenn Überbelegung verwendet wird, der High-Watermark-Zeiger minus dem Anfangszeiger)
3) Wenn newoff + off negativ ist oder außerhalb der Grenzen des initialisierten Teils des Puffers liegt, 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
way - 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 und wenn pos_type die resultierende Stream-Position nicht darstellen kann.

Beispiel

#include <iostream>
#include <strstream>
int main()
{
    char a[] = "123";
    std::strstream ss(a, sizeof a); // 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 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: '";
    std::cout.write(a, sizeof a);
    std::cout << "'\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

Siehe auch

[virtual]
positioniert den nächsten Zeiger in der Eingabesequenz, Ausgabesequenz oder beiden mittels absoluter Adressierung neu
(virtuelle geschützte Elementfunktion)
[virtual]
positioniert den nächsten Zeiger in der Eingabesequenz, Ausgabesequenz oder beiden mittels relativer Adressierung neu
(virtuelle geschützte Elementfunktion von std::basic_streambuf<CharT,Traits> )
[virtual]
positioniert den nächsten Zeiger in der Eingabesequenz, Ausgabesequenz oder beiden mittels relativer Adressierung neu
(virtuelle geschützte Elementfunktion von std::basic_stringbuf<CharT,Traits,Allocator> )
[virtual]
positioniert die Dateiposition mittels relativer Adressierung neu
(virtuelle geschützte Elementfunktion von std::basic_filebuf<CharT,Traits> )