Namespaces
Variants

std::basic_filebuf<CharT,Traits>:: 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 den Dateizeiger, falls möglich, an die Position, die genau off Zeichen vom Anfang, Ende oder der aktuellen Position der Datei entfernt ist (abhängig vom Wert von dir ).

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

Wenn die Multibyte-Zeichenkodierung zustandsabhängig ist ( codecvt::encoding() gibt - 1 zurück) oder variabler Länge ( codecvt::encoding() gibt 0 zurück) und der Offset off nicht 0 ist, schlägt diese Funktion sofort fehl: Sie kann nicht bestimmen, wie viele Bytes off Zeichen entsprechen.

Wenn dir nicht std::basic_ios::cur ist oder der Offset off nicht 0 ist, und die letzte Operation an diesem filebuf-Objekt eine Ausgabe war (d.h. entweder der Put-Puffer nicht leer ist oder die zuletzt aufgerufene Funktion overflow() war), dann ruft es std :: codecvt :: unshift auf, um die notwendige Unshift-Sequenz zu bestimmen, und schreibt diese Sequenz durch Aufruf von overflow() in die Datei.

Konvertiert dann das Argument dir zu einem Wert whence vom Typ int wie folgt:

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

Dann, wenn die Zeichenkodierung feste Breite hat ( codecvt::encoding() gibt eine positive Zahl width zurück), bewegt den Dateizeiger wie durch std:: fseek ( file, width * off, whence ) .

Andernfalls bewegt es den Dateizeiger wie durch std:: fseek ( file, 0 , whence ) .

Das openmode Argument, das von der Basisklassen-Funktionssignatur benötigt wird, wird normalerweise ignoriert, weil std::basic_filebuf nur eine Dateiposition beibehält.

Inhaltsverzeichnis

Parameter

off - relative Position, auf die der Positionsindikator 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, 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

Rückgabewert

Ein neu erstelltes Objekt vom Typ pos_type , das die resultierende Dateiposition speichert, oder pos_type ( off_type ( - 1 ) ) bei Fehlschlag.

Hinweise

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

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()
{
    // bereite eine 10-Byte-Datei mit 4 Zeichen ("zß水𝄋") in UTF-8 vor
    std::ofstream("text.txt") << "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b";
    // Öffnen mit einer nicht-konvertierenden Kodierung
    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';
    // Öffnen mit 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

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

ruft seekoff ( ) auf
(öffentliche Elementfunktion von std::basic_streambuf<CharT,Traits> )
[virtual]
positioniert die Dateiposition neu, unter Verwendung absoluter Adressierung
(virtuelle geschützte Elementfunktion)
bewegt den Dateipositionszeiger an eine bestimmte Position in einer Datei
(Funktion)