std::basic_filebuf<CharT,Traits>::seekpos
| protected: virtual pos_type seekpos( pos_type sp, |
||
Setzt den Dateizeiger, wenn möglich, auf die von sp angegebene Position. Wenn die zugehörige Datei nicht geöffnet ist (is_open() == false), schlägt der Vorgang sofort fehl.
Die Neupositionierung erfolgt wie folgt:
Wenn sp nicht durch Aufrufen von seekoff() oder seekpos() auf derselben Datei erhalten wurde, ist das Verhalten undefiniert.
Inhalt |
[edit] Parameter
| sp | - | Dateiposition, die durch einen früheren Aufruf von seekoff() oder seekpos() auf derselben Datei erhalten wurde | ||||||
| which | - | definiert, welche der Eingabe- und/oder Ausgabesequenzen beeinflusst werden sollen. Es kann eine oder eine Kombination der folgenden Konstanten sein
|
[edit] Rückgabewert
sp bei Erfolg oder pos_type(off_type(-1)) bei Fehler.
[edit] Anmerkungen
seekpos() wird von std::basic_streambuf::pubseekpos() aufgerufen, welche von den Ein-Argument-Versionen von std::basic_istream::seekg() und std::basic_ostream::seekp() aufgerufen wird.
Viele Implementierungen aktualisieren den Leseindexbereich in seekpos() nicht, sondern delegieren dies an underflow(), das vom nächsten sgetc() aufgerufen wird.
[edit] Beispiel
Bei einigen Implementierungen wird der Leseindexbereich durch seekpos() geleert, und das zweite underflow() ist notwendig, um die Auswirkungen zu beobachten.
#include <fstream> #include <iostream> struct mybuf : std::filebuf { pos_type seekpos(pos_type sp, std::ios_base::openmode which) { std::cout << "Before seekpos(" << sp << "), size of the get area is " << egptr() - eback() << " with " << egptr() - gptr() << " read positions available.\n"; pos_type rc = std::filebuf::seekpos(sp, which); std::cout << "seekpos() returns " << rc << ".\nAfter the call, " << "size of the get area is " << egptr() - eback() << " with " << egptr() - gptr() << " read positions available.\n"; // uncomment if get area is emptied by seekpos() // std::filebuf::underflow(); // std::cout << "after forced underflow(), size of the get area is " // << egptr() - eback() << " with " // << egptr() - gptr() << " read positions available.\n"; return rc; } }; int main() { mybuf buf; buf.open("test.txt", std::ios_base::in); std::istream stream(&buf); stream.get(); // read one char to force underflow() stream.seekg(2); }
Mögliche Ausgabe
Before seekpos(2), size of the get area is 110 with 109 read positions available. seekpos() returns 2. After the call, size of the get area is 110 with 108 read positions available.
[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 | seekpos gab einen undefinierten Wert zurückungültige Stream-Position bei Fehler |
pos_type(off_type(-1)) wird bei Fehler zurückgegeben. |
| LWG 171 | C++98 | Die Reihenfolge der Neupositionierungsvorgänge war unklar | wurde klargestellt |
[edit] Siehe auch
| ruft seekpos() auf (öffentliche Member-Funktion von std::basic_streambuf<CharT,Traits>) | |
| [virtuell] |
positioniert die Dateiposition neu, unter Verwendung relativer Adressierung (virtuelle geschützte Memberfunktion) |
| verschiebt den Dateipositionierungsindikator an eine bestimmte Stelle in einer Datei (function) |