Namensräume
Varianten
Aktionen

std::basic_filebuf<CharT,Traits>::seekoff

Von cppreference.com
< cpp‎ | io‎ | basic filebuf
 
 
 
 
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 den Dateizeiger, falls möglich, exakt off Zeichen vom Anfang, Ende oder der aktuellen Position der Datei entfernt (abhängig vom Wert von dir).

Wenn die zugehörige Datei nicht geöffnet ist (is_open() == false), schlägt sofort fehl.

Wenn die Mehrbyte-Zeichenkodierung zustandsabhängig ist (codecvt::encoding() gab -1 zurück) oder variable Länge hat (codecvt::encoding() gab 0 zurück) und der Offset off nicht 0 ist, schlägt sofort fehl: Diese Funktion kann die Anzahl der Bytes, die off Zeichen entsprechen, nicht bestimmen.

Wenn dir nicht std::basic_ios::cur ist oder der Offset off nicht 0 ist und die letzte auf diesem Filebuf-Objekt durchgeführte Operation eine Ausgabe war (d. h. entweder ist der Put-Puffer nicht leer oder die zuletzt aufgerufene Funktion war overflow()), dann wird std::codecvt::unshift aufgerufen, um die notwendige Entschaltungssequenz zu ermitteln, und diese Sequenz wird durch Aufruf von overflow() in die Datei geschrieben.

Wandelt dann das Argument dir in einen Wert whence vom Typ int wie folgt um:

Wert von dir Wert von whence
std::basic_ios::beg SEEK_SET
std::basic_ios::end SEEK_END
std::basic_ios::cur SEEK_CUR

Wenn dann die Zeichenkodierung fest (fixed-width) ist (codecvt::encoding() gibt eine positive Zahl width zurück), wird der Dateizeiger so verschoben, als ob std::fseek(file, width*off, whence) aufgerufen worden wäre.

Andernfalls wird der Dateizeiger so verschoben, als ob std::fseek(file, 0, whence) aufgerufen worden wäre.

Das für die Signatur der Basisklassenfunktion erforderliche Argument openmode wird normalerweise ignoriert, da std::basic_filebuf nur eine einzige Dateiposition verwaltet.

Inhalt

[edit] Parameter

off - relative Position, auf die der Positionsanzeiger 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-Positionsanzeigers
which - definiert, welche der Eingabe- und/oder Ausgabesequenzen beeinflusst werden sollen. Es kann eine oder eine Kombination der folgenden Konstanten sein
Konstante Erklärung
in beeinflusst die Eingabesequenz
out beeinflusst die Ausgabesequenz

[edit] Rückgabewert

Ein neu konstruiertes Objekt vom Typ pos_type, das die resultierende Dateiposition speichert, oder pos_type(off_type(-1)) im Fehlerfall.

[edit] Anmerkungen

seekoff() wird von std::basic_streambuf::pubseekoff aufgerufen, was von std::basic_istream::seekg, std::basic_ostream::seekp, std::basic_istream::tellg und std::basic_ostream::tellp aufgerufen wird.

[edit] Beispiel

#include <fstream>
#include <iostream>
#include <locale>
 
template<typename CharT>
int get_encoding(const std::basic_istream<CharT>& stream)
{
    using Facet = std::codecvt<CharT, char, std::mbstate_t>;
    return std::use_facet<Facet>(stream.getloc()).encoding();
}
 
int main()
{
    // prepare a 10-byte file holding 4 characters ("zß水𝄋") in UTF-8
    std::ofstream("text.txt") << "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b";
 
    // open using a non-converting encoding
    std::ifstream f1("text.txt");
    std::cout << "f1's locale's encoding() returns "
              << get_encoding(f1) << '\n'
              << "pubseekoff(3, beg) returns "
              << f1.rdbuf()->pubseekoff(3, std::ios_base::beg) << '\n'
              << "pubseekoff(0, end) returns "
              << f1.rdbuf()->pubseekoff(0, std::ios_base::end) << '\n';
 
    // open using UTF-8
    std::wifstream f2("text.txt");
    f2.imbue(std::locale("en_US.UTF-8"));
    std::cout << "f2's locale's encoding() returns "
              << get_encoding(f2) << '\n'
              << "pubseekoff(3, beg) returns "
              << f2.rdbuf()->pubseekoff(3, std::ios_base::beg) << '\n'
              << "pubseekoff(0, end) returns "
              << f2.rdbuf()->pubseekoff(0, std::ios_base::end) << '\n';
}

Ausgabe

f1's locale's encoding() returns 1
pubseekoff(3, beg) returns 3
pubseekoff(0, end) returns 10
f2's locale's encoding() returns 0
pubseekoff(3, beg) returns -1
pubseekoff(0, end) returns 10

[edit] 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.

[edit] Siehe auch

ruft seekoff() auf
(öffentliche Member-Funktion von std::basic_streambuf<CharT,Traits>) [bearbeiten]
[virtuell]
positioniert die Dateiposition neu, unter Verwendung absoluter Adressierung
(virtuelle geschützte Memberfunktion) [edit]
verschiebt den Dateipositionierungsindikator an eine bestimmte Stelle in einer Datei
(function) [bearbeiten]