Namensräume
Varianten
Aktionen

fseek

Von cppreference.com
< c‎ | io
 
 
Datei-Ein-/Ausgabe
Typen und Objekte
        
Funktionen
Datei-Zugriff
(C95)
Unformatierte Ein-/Ausgabe
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

Formatierte Eingabe
Direkte Ein-/Ausgabe
Formatierte Ausgabe
Dateipositionierung
fseek
Fehlerbehandlung
Operationen auf Dateien
 
Definiert in Header <stdio.h>
int fseek( FILE* stream, long offset, int origin );
#define SEEK_SET    /* undefiniert */

#define SEEK_CUR    /* undefiniert */

#define SEEK_END    /* undefiniert */

Setzt den Dateipositionierungsindikator für den Dateistrom stream auf den Wert, auf den durch offset gezeigt wird.

Wenn der stream im Binärmodus geöffnet ist, ist die neue Position genau offset Bytes, gemessen vom Anfang der Datei, 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 ftell für einen Strom zurückgegeben wurde, der mit derselben Datei verbunden ist (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ärströme (das Ergebnis von ftell ist mit SEEK_SET erlaubt und ein Null-Offset ist von SEEK_SET und SEEK_CUR erlaubt, aber nicht SEEK_END).

Zusätzlich zur Änderung des Dateipositionierungsindikators macht fseek die Effekte von ungetc rückgängig und löscht den End-of-File-Status, falls zutreffend.

Wenn ein Lese- oder Schreibfehler auftritt, wird der Fehlerindikator für den Strom (ferror) gesetzt und die Dateiposition bleibt unverändert.

Inhalt

[bearbeiten] Parameter

stream - Dateistream, der modifiziert werden soll
offset - Anzahl der Zeichen, um die die Position relativ zum Ursprung verschoben wird
Ursprung - Position, zu der offset addiert wird. Kann einen der folgenden Werte haben: SEEK_SET, SEEK_CUR, SEEK_END

[bearbeiten] Rückgabewert

0 bei Erfolg, ein Wert ungleich Null bei Fehler.

[bearbeiten] Anmerkungen

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.

Für Textströme sind die einzigen gültigen Werte für offset 0 (anwendbar für jeden origin) und ein Wert, der durch einen früheren Aufruf von ftell zurückgegeben wurde (nur anwendbar für SEEK_SET).

POSIX erlaubt das Suchen über das bestehende Dateiende hinaus. Wenn nach dieser Suche eine Ausgabe erfolgt, gibt jedes Lesen aus der Lücke null Bytes zurück. Wo vom Dateisystem unterstützt, wird hierbei eine sparse Datei erstellt.

POSIX verlangt auch, dass fseek zuerst fflush aufruft, wenn noch ungeschriebene Daten vorhanden sind (ob der Verschiebezustand wiederhergestellt wird, ist implementierungsabhängig).

POSIX gibt an, 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 zu arbeiten, die größer als 2 GiB sind.

[bearbeiten] Beispiel

fseek mit Fehlerprü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

[bearbeiten] Referenzen

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

[bearbeiten] Siehe auch

verschiebt den Dateipositionierungsindikator an eine bestimmte Stelle in einer Datei
(Funktion) [bearbeiten]
holt den Dateipositionierungsindikator
(Funktion) [bearbeiten]
gibt den aktuellen Dateipositionierungsindikator zurück
(Funktion) [bearbeiten]
verschiebt den Dateipositionierungsindikator an den Anfang einer Datei
(Funktion) [bearbeiten]