Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

lseek, lseek64 - Lese-/Schreibzeiger positionieren (elementar)

&pagelevel(4)&pagelevel

Definition

#include <stdio.h>

off__t lseek(int dk, off_t distanz, int ort);
off64_t lseek64(int dk, off64_t distanz, int ort);

lseek und lseek64 positionieren den Lese-/Schreibzeiger für die Datei mit Dateikennzahl dk gemäß den Angaben in distanz und ort. Sie haben damit die Möglichkeit, eine Datei nichtsequenziell zu bearbeiten. Als Ergebnis liefern lseek und lseek64 die aktuelle Position in der Datei.

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

Es besteht kein funktionaler Unterschied zwischen lseek und lseek64, außer dass bei lseek64 der Offset-Typ off64_t und der Rückgabetyp off64_t verwendet werden.

Textdateien (SAM, ISAM) lassen sich absolut auf Dateianfang und -ende positionieren sowie auf eine vorher mit tell gemerkte Position.

Binärdateien (PAM, INCORE) lassen sich sowohl absolut positionieren (s.o.) als auch relativ um eine gewünschte Anzahl Bytes, bezogen auf Dateianfang, Dateiende oder aktuelle Position. SAM-Dateien werden mit elementaren Funktionen als Textdateien verarbeitet, außer wenn bei open O_RECORD angegeben wurde.

Parameter

int dk

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

off_t / off64_t distanz, int ort

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

Textdateien (SAM, ISAM)

Mögliche Werte der Parameter:

distanz

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

distanz                     
(64-Bit-Schnittstelle)

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

ort

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

Sinnvolle Kombinationsmöglichkeiten und Wirkung:

distanz

ort

Wirkung

tell/lseek-Wert bzw. lseek64-Wert

SEEK_SET

Positionieren auf die durch tell oder lseek/lseek64 gemerkte Position.

0L bzw. 0LL

SEEK_SET

Positionieren auf Dateianfang.

0L bzw. 0LL

SEEK_CUR

Abfrage der aktuellen Position ohne Positionierung.

0L bzw. 0LL

SEEK_END

Positionieren auf Dateiende.

Binärdateien (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 bzw. 0LL: 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. 0LL

SEEK_SET

Positionieren auf Dateianfang.

0L bzw. 0LL

SEEK_CUR

Abfrage der aktuellen Position ohne Positionierung.

0L bzw. 0LL

SEEK_END

Positionieren auf Dateiende.

positive Zahl

SEEK_SET
SEEK_CUR
SEEK_END

Vorwärtspositionieren ab Dateianfang,
ab aktueller Position,
ab Dateiende (über das Dateiende hinaus).

negative Zahl

SEEK_CUR
SEEK_END

Rückwärtspositionieren ab aktueller Position,
ab Dateiende.

tell/lseek-Wert bzw. lseek64-Wert

SEEK_SET

Positionieren auf die durch einen tell oder lseek/lseek64-Aufruf gemerkte Position.

Returnwert

Position in der Datei bei Erfolg, und zwar



bei Binärdateien die Anzahl Bytes, die der Lese-/Schreibzeiger vom Dateianfang entfernt ist,
bei Textdateien die absolute Position des Lese-/Schreibzeigers.


-1

im Fehlerfall. Zusätzlich wird in errno eine entsprechende Fehlerinformation abgelegt, und zwar
EBADF: Unzulässige Dateikennzahl
ESPIPE: Unzulässige Positionierung
EINVAL: Unzulässiges Argument.
EMDS: Bei nur zum Lesen geöffneter Binärdatei hinter das Dateiende positioniert.

Hinweise

Die Aufrufe lseek(dk, 0L, SEEK_CUR) und tell(dk) sind äquivalent, d.h. sie rufen beide die aktuelle Position in der Datei ab, ohne zu positionieren.

Werden in eine Textdatei neue Sätze geschrieben (geöffnet zum Neuerstellen oder Anhängen) und erfolgt ein lseek/lseek64-Aufruf, dann werden zunächst ggf. restliche Daten aus dem C-internen 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 lseek/lseek64 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.

Da die Informationen über die Dateiposition in einem Feld zusammengefasst werden, ergeben sich für die Größe von SAM- und ISAM-Dateien folgende Einschränkungen:

SAM-Datei


lseek()

lseek64()

Satzlänge

<= 2048 Byte

<= 32 KByte

Satzanzahl/Block

<= 255

< 32 K

Blockanzahl

<= 2047

-

ISAM-Datei


lseek()

lseek64()

Satzlänge

<= 32 KByte

<= 32 KByte

Satzanzahl

< 32 K

-

Satz-E/A

lseek und lseek64 können nur zum Positionieren auf Dateianfang oder Dateiende verwendet werden.

lseek(dk,0L,SEEK_SET) bzw. lseek64(dk,0LL,SEEK_SET) positioniert auf den ersten Satz der Datei.

lseek(dk,0L,SEEK_END) bzw. lseek64(dk,0LL,SEEK_SET) positioniert hinter den letzten Satz der Datei.

Bei Aufrufen mit anderen Argumenten liefern lseek und lseek64 EOF.

Beispiel

Folgendes Programm liest ab Position 10 aus der Datei, die als erstes Argument beim Aufruf übergeben wird, fügt den Inhalt ans Ende der Datei an, falls ein zweites Argument
angegeben wird, oder schreibt auf Standardausgabe (funktioniert nur mit Binärdateien, d.h. in diesem Fall nur mit PAM-Dateien):

#include <stdio.h>
#include <stdlib>
int fd1, fd2;
long result;
char c;
int main(int argc, char *argv[])
{
  if((fd1 = open (argv[1],0)) < 0) exit(1);
  if(argc < 3)
          fd2 = 1;
  else
          fd2 = open(argv[2], 1);
  result = lseek(fd1, 10L, SEEK_SET);
  printf("aktuelle Position in Datei1 : %ld\n", tell(fd1));
  /* Weitere mögliche Positionsabfragen:
  printf("aktuelle Position in Datei1: %ld\n, result);
  printf("aktuelle Position in Datei1: %ld\n, lseek(fd1, 0L, SEEK_CUR)); */
  while(read(fd1, &c, 1) > 0)
          write(fd2, &c, 1);
  close(fd1);
  close(fd2);
  return 0;
}

Siehe auch

tell, fseek, fseek64, ftell, ftell64