Namespaces
Variants

fseek

From cppreference.net
< c ‎ | io
Definiert in Header <stdio.h>
int fseek ( FILE * stream, long offset, int origin ) ;
#define SEEK_SET    /* unspecified */

#define SEEK_CUR    /* unspecified */

#define SEEK_END    /* unspecified */

Setzt den Dateipositionsanzeiger für den Dateistrom stream auf den Wert, auf den offset zeigt.

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 ftell auf einem Stream zurückgegeben wurde, der mit derselben Datei assoziiert 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 ftell ist mit SEEK_SET und Null-Offset erlaubt von SEEK_SET und SEEK_CUR , aber nicht SEEK_END ).

Zusätzlich zum Ändern der Dateipositionsanzeige setzt fseek die Effekte von 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 ( 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 annehmen: 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 machen, z.B. durch Ausgeben einer Multibyte-Sequenz mit einer anderen Länge.

Für Textströme sind die einzigen gültigen Werte von offset entweder 0 (anwendbar auf jeden origin ) oder ein von einem früheren Aufruf von ftell zurückgegebener Wert (nur anwendbar auf SEEK_SET ).

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 Nullbytes 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 Schiftzustand wiederhergestellt wird, ist implementierungsdefiniert).

POSIX legt fest, 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

fseek mit Fehlerüberprüfung:

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    // Prepare an array of double values.
    #define SIZE 5
    double A[SIZE] = {1.0, 2.0, 3.0, 4.0, 5.0};
    // Write array to a file.
    FILE * fp = fopen("test.bin", "wb");
    fwrite(A, sizeof(double), SIZE, fp);
    fclose (fp);
    // Read the double values into array B.
    double B[SIZE];
    fp = fopen("test.bin", "rb");
    // Set the file position indicator in front of third double value.
    if (fseek(fp, sizeof(double) * 2L, SEEK_SET) != 0)
    {
        fprintf(stderr, "fseek() failed in file %s at line # %d\n",
                __FILE__, __LINE__ - 2);
        fclose(fp);
        return EXIT_FAILURE;
    }
    int ret_code = fread(B, sizeof(double), 1, fp); // reads one double value
    printf("ret_code == %d\n", ret_code);           // prints the number of values read
    printf("B[0] == %.1f\n", B[0]);                 // prints one value
    fclose(fp);
    return EXIT_SUCCESS;
}

Mögliche Ausgabe:

ret_code == 1
B[0] == 3.0

Referenzen

  • C23-Standard (ISO/IEC 9899:2024):
  • 7.23.9.2 Die fseek-Funktion (S.: TBD)
  • C17-Standard (ISO/IEC 9899:2018):
  • 7.21.9.2 Die fseek-Funktion (S: 245)
  • C11-Standard (ISO/IEC 9899:2011):
  • 7.21.9.2 Die fseek-Funktion (S: 336-337)
  • C99-Standard (ISO/IEC 9899:1999):
  • 7.19.9.2 Die fseek-Funktion (S: 302-303)
  • C89/C90 Standard (ISO/IEC 9899:1990):
  • 4.9.9.2 Die fseek-Funktion

Siehe auch

bewegt den Dateipositionszeiger an eine bestimmte Position in einer Datei
(Funktion)
ermittelt den Dateipositionszeiger
(Funktion)
gibt den aktuellen Dateipositionszeiger zurück
(Funktion)
bewegt den Dateipositionszeiger an den Anfang einer Datei
(Funktion)