std::basic_filebuf<CharT,Traits>:: seekoff
|
protected
:
virtual
pos_type seekoff
(
off_type off,
|
||
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:
|
||||||||
| which | - |
definiert, welche der Eingabe- und/oder Ausgabesequenzen beeinflusst werden sollen. Es kann eine oder eine Kombination der folgenden Konstanten sein:
|
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) |