std::basic_filebuf<CharT,Traits>::seekoff
| protected: virtual pos_type seekoff( off_type off, |
||
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
| ||||||||
| which | - | definiert, welche der Eingabe- und/oder Ausgabesequenzen beeinflusst werden sollen. Es kann eine oder eine Kombination der folgenden Konstanten sein
|
[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 undefiniertenungü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>) | |
| [virtuell] |
positioniert die Dateiposition neu, unter Verwendung absoluter Adressierung (virtuelle geschützte Memberfunktion) |
| verschiebt den Dateipositionierungsindikator an eine bestimmte Stelle in einer Datei (function) |