Namespaces
Variants

std:: fseek

From cppreference.net
< cpp ‎ | io ‎ | c
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)