Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

fseek, fseeko, fseek64, fseeko64 - Lese-/Schreibzeiger positionieren

&pagelevel(4)&pagelevel

Definition

#include <stdio.h>

int fseek(FILE *dz, long distanz, int ort);
int fseeko(FILE *dz, off_t distanz; int ort);
int fseek64(FILE *dz, long long distanz, int ort);
int fseeko64(FILE *dz, off64_t distanz, int ort);

fseek/fseeko und fseek64/fseeko64 positionieren den Lese-/Schreibzeiger für die Datei mit Dateizeiger dz gemäß den Angaben in distanz und ort. Sie haben damit die Möglichkeit, eine Datei nicht-sequenziell zu bearbeiten.

In Textdateien (SAM im Textmodus, ISAM) kann man absolut auf Dateianfang und Dateiende positionieren sowie auf eine vorher mit ftell/ftello bzw. ftell64/ftello64 gemerkte Position.

In Binärdateien (SAM im Binärmodus, PAM, INCORE) kann man sowohl absolut positionieren (s.o.) als auch relativ um eine gewünschte Anzahl Bytes, bezogen auf Dateianfang, Dateiende oder aktuelle Position.

Für die Bearbeitung von Dateien > 2 GB verfahren Sie wie folgt:

  • Falls das Define _FILE_OFFSET_BITS 64 (siehe "Unterstützung von DVS- und UFS-Dateien > 2 GB") gesetzt ist, rufen Sie fseeko auf. Implizit wird dann fseeko64 mit den passenden Parametern verwendet.
    Die automatische Umsetzung für fseek wird nicht unterstützt.

  • Andernfalls müssen Sie fseek64 bzw. fseeko64 aufrufen.

Es besteht kein funktionaler Unterschied zwischen fseek und fseek64 bzw. fseeko und fseeko64. Die Funktionen unterscheiden sich nur hinsichtlich des verwendeten Offset-Typs.

Parameter

FILE *dz

Dateizeiger der Datei, deren Lese-/Schreibzeiger positioniert werden soll.

long distanz / off_t distanz / long long distanz / off64_t distanz

Bedeutung, Kombinationsmöglichkeiten und Wirkung dieser Parameter sind für Text- und Binärdateien unterschiedlich und werden deshalb im Folgenden getrennt beschrieben.

Textdateien (SAM im Textmodus, ISAM)

Mögliche Werte der Parameter:

distanz

0L oder Wert, der durch einen vorhergehenden ftell/ftello-Aufruf ermittelt wurde.

distanz (64-Bit-Schnittstelle)

0LL oder Wert, der durch einen vorhergehenden ftell64/ftello64-Aufruf ermittelt wurde.

ort

SEEK_SET (Dateianfang)
SEEK_END (Dateiende)

Sinnvolle Kombinationsmöglichkeiten und Wirkung:

distanz

ort

Wirkung

ftell- / ftello-Wert bzw. ftell64- / ftello64-Wert

SEEK_SET

Positionieren auf die durch ftell/ftello bzw. ftell64/ftello64 ermittelte Position.

0L bzw. 0LL

SEEK_SET

Positionieren auf Dateianfang.

0L bzw. 0LL

SEEK_END

Positionieren auf Dateiende.

Binärdateien (SAM im Binärmodus, PAM, INCORE)

Mögliche Werte der Parameter:

distanz

Anzahl der Bytes, um die der aktuelle Lese-/Schreibzeiger verschoben werden soll, und zwar
positive Zahl: Vorwärtspositionieren Richtung Dateiende
negative Zahl: Rückwärtspositionieren Richtung Dateianfang
0L: absolut Positionieren auf Dateianfang bzw. -ende.

ort

Bei absoluter Positionierung auf Dateianfang oder -ende, wohin der Lese-/Schreibzeiger verschoben werden soll und bei relativer Positionierung, von wo aus der Lese-/Schreibzeiger um distanz Bytes verschoben werden soll:

SEEK_SET (Dateianfang)
SEEK_CUR (aktuelle Position)
SEEK_END (Dateiende)

Sinnvolle Kombinationsmöglichkeiten und Wirkung:

distanz

ort

Wirkung

0L bzw. für 64-Bit: 0LL

SEEK_SET

Positionieren auf Dateianfang.

0L bzw. für 64-Bit: 0LL

SEEK_END

Positionieren auf Dateiende.

positive Zahl

SEEK_SET

Vorwärtspositionieren ab Dateianfang,

SEEK_CUR

ab aktueller Position,

SEEK_END

ab Dateiende (über das Dateiende hinaus).

negative Zahl


SEEK_CUR

Rückwärtspositionieren ab aktueller Position,

SEEK_END

ab Dateiende.

ftell- / ftello -Wert bzw. ftell64- / ftello64-Wert

SEEK_SET

Positionieren auf die durch einen ftell/ftello- bzw. ftell64/ftello64-Aufruf gemerkte Position.

Returnwert

0

bei Erfolg.


-1

bei Fehler.
Wenn Sie bei einer nur zum Lesen geöffneten Binärdatei hinter das Dateiende positionieren, wird errno auf EMDS gesetzt.

Hinweise

Der Aufruf fseek(dz,0L,SEEK_SET) bzw. fseek64(dz,0LL,SEEK_SET) ist äquivalent zu dem Aufruf rewind(dz).

Werden in eine Textdatei neue Sätze geschrieben (geöffnet zum Neuerstellen oder Anhängen) und erfolgt ein fseek/fseeko- bzw. fseek64/fseeko64-Aufruf, dann werden zunächst ggf. restliche Daten aus dem Puffer in die Datei geschrieben und mit Zeilenende (\n) abgeschlossen.

Ausnahme bei ANSI-Funktionalität:
Wenn die Daten einer ISAM-Datei im Puffer nicht mit einem Neue-Zeile-Zeichen enden, bewirkt fseek/fseeko bzw. fseek64/fseeko64 keinen Zeilenwechsel (bzw. Satzwechsel). D.h., die Daten werden beim Schreiben aus dem Puffer nicht automatisch mit einem Neue-Zeile-Zeichen abgeschlossen. Nachfolgende Daten verlängern den Satz in der Datei. Beim Lesen einer ISAM-Datei werden daher nur Neue-Zeile-Zeichen eingelesen, die vom Programm explizit geschrieben wurden.

Wenn Sie bei einer zum Schreiben geöffneten Binärdatei hinter das Dateiende positionieren, entsteht ein „Loch“ zwischen den letzten physisch gespeicherten Daten und den neu geschriebenen Daten. Lesen aus diesem „Loch“ liefert binäre Nullen. Wenn Sie bei einer nur zum Lesen geöffneten Binärdatei hinter das Dateiende positionieren, führt das zu einem Fehler (EMDS).

Auf Systemdateien (SYSDTA, SYSLST, SYSOUT) kann nicht positioniert werden.

Ein erfolgreicher Aufruf der Funktion fseek/fseeko bzw. fseek64/fseeko64 löscht das EOF-Flag der Datei und hebt alle Effekte der vorangegangenen ungetc-Aufrufe für diese Datei auf.

Satz-E/A

fseek/fseeko und fseek64/fseeko64 können nur zum Positionieren auf Dateianfang oder Dateiende verwendet werden.

fseek(dz,0L,SEEK_SET) bzw. fseek64(dz,0LL,SEEK_SET) positioniert auf den ersten Satz der Datei.

fseeko(dz,0L,SEEK_SET) bzw. fseeko64(dz,0LL,SEEK_SET) positioniert auf den ersten Satz der Datei.

fseek(dz,0L,SEEK_END) bzw. fseek64(dz,0LL,SEEK_SET) positioniert hinter den letzten Satz der Datei.

fseeko(dz,0L,SEEK_END) bzw. fseeko64(dz,0LL,SEEK_SET) positioniert hinter den letzten Satz der Datei.

Bei Aufrufen mit anderen Argumenten liefern fseek/fseeko und fseek64/fseeko64 EOF. 

Beispiel 1

Folgendes Programm liest die Datei dat ab dem elften Zeichen bis Dateiende (funktioniert nur für Binärdateien).

#include <stdio.h>
int main(void)
{
  FILE *fp;
  int c;
  if((fp = fopen("dat","rb")) != NULL)
  {
               /* die ersten 10 Zeichen überspringen */
    fseek(fp,10L,SEEK_SET);
    while((c=getc(fp)) != EOF)
          putc((char)c,stdout);
    fclose(fp);
  }
  return 0;
}

Beispiel 2

Folgendes Programm verarbeitet eine Datei im Update-Modus. Kleinbuchstaben werden als Großbuchstaben zurückgeschrieben, alle anderen Zeichen bleiben unverändert.

#include <stdio.h>
#include <ctype.h>
int main(void)
{
   FILE *fp;
   int c;
   long n;
   fp = fopen("link=link","r+w");
     do
     {
       n = ftell(fp);
       c = getc(fp);
       if (islower(c) == 0) continue; /* Wenn Zeichen kein Kleinbuchstabe, */
                                           /* nächstes Zeichen einlesen */
       else 
       {                              /* Wenn Zeichen ein Kleinbuchstabe, */
         fseek(fp, n, SEEK_SET);      /* auf dieses positionieren und als */
         fputc((toupper(c)), fp);     /* Großbuchstaben zurückschreiben. */
       } 
     }
     while(c != EOF);
     fclose(fp);
     return 0;
}

Siehe auch

ftell, ftello, ftell64, ftello64, fsetpos, fsetpos64, lseek, lseek64, rewind, tell