std::fseek
| Definiert in Header <cstdio> |
||
| int fseek( std::FILE* stream, long offset, int origin ); |
||
Setzt den Dateipositionierer für den Dateistream stream.
Wenn der stream im Binärmodus geöffnet ist, ist die neue Position exakt offset Bytes vom Anfang der Datei entfernt, wenn origin SEEK_SET ist, von der aktuellen Dateiposition, wenn origin SEEK_CUR ist, und vom Ende der Datei, wenn origin SEEK_END ist. Binäre Streams müssen SEEK_END nicht unterstützen, insbesondere wenn zusätzliche Null-Bytes 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 durch einen früheren Aufruf von std::ftell auf einem Stream, der mit derselben Datei assoziiert ist, zurückgegeben wurde (was nur mit origin von SEEK_SET funktioniert).
Wenn der stream breit-orientiert ist, gelten die Einschränkungen sowohl für Text- als auch für Binärstreams (Ergebnis von std::ftell ist mit SEEK_SET erlaubt und Null-Offset ist von SEEK_SET und SEEK_CUR erlaubt, aber nicht SEEK_END).
Zusätzlich zur Änderung des Dateipositionierers macht fseek die Effekte von std::ungetc rückgängig und löscht den Dateiende-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.
Inhalt |
[edit] Parameter
| stream | - | Dateistream, der modifiziert werden soll |
| offset | - | Anzahl der Zeichen, um die die Position relativ zum Ursprung verschoben werden soll |
| Ursprung | - | Position, zu der offset addiert wird. Es kann einen der folgenden Werte haben: SEEK_SET, SEEK_CUR, SEEK_END |
[edit] Rückgabewert
0 bei Erfolg, ein von Null verschiedener Wert bei einem Fehler.
[edit] Hinweise
Nach dem Springen zu einer Nicht-Ende-Position in einem breiten Stream kann der nächste Aufruf einer beliebigen Ausgabefunktion den Rest der Datei undefiniert machen, z. B. durch die Ausgabe einer Mehrbyte-Sequenz mit anderer Länge.
POSIX erlaubt das Springen über das bestehende Dateiende hinaus. Wenn nach diesem Springen eine Ausgabe erfolgt, gibt jede Lesung aus der Lücke null Bytes zurück. Wo vom Dateisystem unterstützt, wird eine Sparse-Datei erstellt.
POSIX verlangt auch, dass fseek zuerst fflush ausführt, wenn ungeschriebene Daten vorhanden sind (aber ob der Verschiebungszustand wiederhergestellt wird, ist implementierungsabhängig). Die Standard-C++-Dateistreams garantieren sowohl das Leeren als auch das Zurücksetzen der Zeichen: std::basic_filebuf::seekoff.
POSIX legt fest, dass fseek bei einem Fehler -1 zurückgeben und errno setzen soll, um den Fehler anzuzeigen.
Unter Windows kann _fseeki64 verwendet werden, um mit Dateien größer als 2 GiB zu arbeiten.
[edit] Beispiel
#include <cassert> #include <cstdio> #include <cstdint> #include <fstream> #include <vector> int main() { std::ofstream("dummy.nfo") << "8 bytes\n"; // create the file std::FILE* fp = std::fopen("dummy.nfo", "rb"); assert(fp); std::fseek(fp, 0, SEEK_END); // seek to end const std::size_t filesize = std::ftell(fp); std::vector<std::uint8_t> buffer(filesize); std::fseek(fp, 0, SEEK_SET); // seek to start 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
[edit] Siehe auch
| verschiebt den Dateipositionierungsindikator an eine bestimmte Stelle in einer Datei (function) | |
| holt den Dateipositionierungsindikator (function) | |
| gibt den aktuellen Dateipositionierungsindikator zurück (function) | |
| verschiebt den Dateipositionierungsindikator an den Anfang einer Datei (function) | |
| C-Dokumentation für fseek
| |