Namensräume
Varianten
Aktionen

std::strstreambuf::seekoff

Von cppreference.com
< cpp‎ | io‎ | strstreambuf
 
 
 
 
protected:

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

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

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 welche ios_base::in einschließt und dieser Puffer zum Lesen geöffnet ist, wird der Lesezeiger std::basic_streambuf::gptr innerhalb des Lesegebiets wie unten beschrieben neu positioniert.
  • Wenn welche ios_base::out einschließt und dieser Puffer zum Schreiben geöffnet ist, wird der Schreibzeiger std::basic_streambuf::pptr innerhalb des Schreibgebiets wie unten beschrieben neu positioniert.
  • Wenn welche sowohl ios_base::in als auch ios_base::out einschließt und der Puffer sowohl zum Lesen als auch zum Schreiben geöffnet ist und weg entweder ios_base::beg oder ios_base::end ist, werden sowohl der Lese- als auch der 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 weg == ios_base::beg, dann ist newoff Null.
b) Wenn weg == ios_base::cur, dann ist newoff die aktuelle Position des Zeigers (gptr() - eback() oder pptr() - pbase()).
c) Wenn weg == ios_base::end, dann ist newoff die Länge des gesamten initialisierten Teils des Puffers (bei Gesamt-Allokation ist dies der High-Watermark-Zeiger minus dem Anfangszeiger).
3) Wenn newoff + off negativ ist oder außerhalb 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.

Inhalt

[bearbeiten] Parameter

off - relativer Positionsversatz, auf den die nächsten Zeiger gesetzt werden sollen.
weg - 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 und wenn pos_type die resultierende Stream-Position nicht darstellen kann.

[bearbeiten] 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'

[bearbeiten] Defect reports

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.

[bearbeiten] Siehe auch

[virtuell]
positioniert den nächsten Zeiger in der Eingabesequenz, Ausgabesequenz oder beidem neu, unter Verwendung absoluter Adressierung
(virtuelle protected Member-Funktion) [bearbeiten]
[virtuell]
positioniert den nächsten Zeiger in der Eingabesequenz, Ausgabesequenz oder beidem neu, unter Verwendung relativer Adressierung
(virtuelle geschützte Member-Funktion von std::basic_streambuf<CharT,Traits>) [bearbeiten]
[virtuell]
positioniert den nächsten Zeiger in der Eingabesequenz, Ausgabesequenz oder beidem neu, unter Verwendung relativer Adressierung
(virtuelle protected Member-Funktion von std::basic_stringbuf<CharT,Traits,Allocator>) [edit]
[virtuell]
positioniert die Dateiposition neu, unter Verwendung relativer Adressierung
(virtuelle protected Member-Funktion von std::basic_filebuf<CharT,Traits>) [edit]