std:: fseek
|
Definiert in Header
<cstdio>
|
||
|
int
fseek
(
std::
FILE
*
stream,
long
offset,
int
origin
)
;
|
||
Setzt den Dateipositionsanzeiger für den Dateistrom stream .
Wenn der stream im Binärmodus geöffnet ist, ist die neue Position genau offset Bytes gemessen vom Dateianfang, wenn origin gleich SEEK_SET ist, von der aktuellen Dateiposition, wenn origin gleich SEEK_CUR ist, und vom Dateiende, wenn origin gleich SEEK_END ist. Binäre Streams müssen SEEK_END nicht unterstützen, insbesondere wenn zusätzliche Nullbytes ausgegeben werden.
Wenn der stream im Textmodus geöffnet ist, sind die einzigen unterstützten Werte für offset null (was mit jedem origin funktioniert) und ein Wert, der von einem früheren Aufruf von std::ftell auf einem Stream zurückgegeben wurde, der mit derselben Datei verknüpft ist (was nur mit origin von SEEK_SET funktioniert).
Wenn der stream weit-orientiert ist, gelten die Einschränkungen sowohl für Text- als auch für Binärströme (das Ergebnis von std::ftell ist mit SEEK_SET erlaubt und Null-Offset ist von SEEK_SET und SEEK_CUR erlaubt, aber nicht von SEEK_END ).
Zusätzlich zum Ändern der Dateipositionsanzeige setzt
fseek
die Effekte von
std::ungetc
zurück und löscht den End-of-File-Status, falls zutreffend.
Wenn ein Lese- oder Schreibfehler auftritt, wird der Fehlerindikator für den Stream ( std::ferror ) gesetzt und die Dateiposition bleibt unverändert.
Inhaltsverzeichnis |
Parameter
| stream | - | Dateistrom, der zu modifizieren ist |
| offset | - | Anzahl der Zeichen, um die die Position relativ zum Ursprung verschoben wird |
| origin | - | Position, zu der offset addiert wird. Kann einen der folgenden Werte haben: SEEK_SET , SEEK_CUR , SEEK_END |
Rückgabewert
0 bei Erfolg, andernfalls ein Wert ungleich Null.
Hinweise
Nach dem Positionieren an einer Nicht-End-Position in einem breiten Stream kann der nächste Aufruf einer Ausgabefunktion den Rest der Datei undefiniert lassen, z.B. durch Ausgeben einer Multibyte-Sequenz mit einer anderen Länge.
POSIX erlaubt das Positionieren über das bestehende Dateiende hinaus. Wenn nach diesem Positionieren eine Ausgabe durchgeführt wird, gibt jedes Lesen aus der Lücke Null-Bytes zurück. Falls vom Dateisystem unterstützt, erzeugt dies eine sparse file .
POSIX verlangt außerdem, dass
fseek
zuerst einen
fflush
durchführt, falls ungeschriebene Daten vorhanden sind (ob jedoch der Shift-Zustand wiederhergestellt wird, ist implementierungsdefiniert). Die standardmäßigen C++-Dateistreams garantieren sowohl das Flushen als auch das Zurücksetzen des Shift-Zustands:
std::basic_filebuf::seekoff
.
POSIX spezifiziert, dass
fseek
bei einem Fehler
-
1
zurückgeben und
errno
auf den entsprechenden Fehlercode setzen soll.
Unter Windows kann
_fseeki64
verwendet werden, um mit Dateien größer als 2 GiB zu arbeiten.
Beispiel
#include <cassert> #include <cstdio> #include <cstdint> #include <fstream> #include <vector> int main() { std::ofstream("dummy.nfo") << "8 bytes\n"; // Datei erstellen std::FILE* fp = std::fopen("dummy.nfo", "rb"); assert(fp); std::fseek(fp, 0, SEEK_END); // bis zum Ende positionieren const std::size_t filesize = std::ftell(fp); std::vector<std::uint8_t> buffer(filesize); std::fseek(fp, 0, SEEK_SET); // zum Anfang positionieren std::fread(buffer.data(), sizeof(std::uint8_t), buffer.size(), fp); std::fclose(fp); std::printf("I've read %zi bytes\n", filesize); }
Mögliche Ausgabe:
I've read 8 bytes
Siehe auch
|
verschiebt den Dateipositionszeiger an eine bestimmte Position in einer Datei
(Funktion) |
|
|
ermittelt den Dateipositionszeiger
(Funktion) |
|
|
gibt den aktuellen Dateipositionszeiger zurück
(Funktion) |
|
|
verschiebt den Dateipositionszeiger an den Anfang einer Datei
(Funktion) |
|
|
C-Dokumentation
für
fseek
|
|