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 in Datei auf aktuellen Wert positionieren

&pagelevel(4)&pagelevel

Definition

Optional
#include <sys/types.h>  (Ende)
#include <unistd.h>

off_t lseek (int fildes, off_t offset, int whence);
off64_t lseek64 (int fildes, off64_t offset, int whence);

Beschreibung

Wenn POSIX-Dateien ausgeführt werden, verhält sich die Funktion XPG-konform wie folgt:

lseek() setzt den Lese-/Schreibzeiger für die Datei mit dem Dateideskriptor fildes wie nachfolgend beschrieben:

Ist whence gleich SEEK_SET, wird der Zeiger gleich offset Bytes gesetzt.

Ist whence gleich SEEK_CUR, wird der Zeiger auf die aktuelle Position plus offset gesetzt.

Ist whence gleich SEEK_END, wird der Zeiger auf die Größe der Datei plus offset gesetzt.

Die symbolischen Konstanten SEEK_SET, SEEK_CUR und SEEK_END sind in der Include-Datei unistd.h definiert.

Die Funktion lseek() hat keine Wirkung, wenn sie auf eine Datei angewendet wird, auf der nicht positioniert werden kann.

lseek() erlaubt, dass der Lese-/Schreibzeiger hinter die existierenden Daten der Datei gesetzt werden kann. Werden später Daten an diese Position geschrieben, so liefern nachfolgende Leseoperationen in der Lücke Nullbytes, bis wirklich Daten in diese Lücke geschrieben wurden.

lseek() erweitert nicht von sich aus die Größe einer Datei.

Es besteht kein funktionaler Unterschied zwischen lseek() und lseek64(), außer dass lseek64() den Offset-Typ off64_t verwendet.

BS2000
Wenn BS2000-Dateien ausgeführt werden, ist Folgendes zu beachten:

lseek() positioniert den Lese-/Schreibzeiger für die Datei mit Dateideskriptor fildes gemäß den Angaben in offset und whence. Damit ist die Möglichkeit gegeben, eine Datei nicht-sequenziell zu bearbeiten. Als Ergebnis liefert lseek() die aktuelle Position in der Datei.

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 stets als Textdateien verarbeitet.

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

Textdateien (SAM, ISAM)

Mögliche Werte:

offset

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

whence

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

Sinnvolle Kombinationsmöglichkeiten und Wirkung:

offset

whence

Wirkung

tell/lseek-Wert

SEEK_SET

Positionieren auf die durch tell() oder lseek() gemerkte Position.

0L

SEEK_SET

Positionieren auf Dateianfang.

0L

SEEK_CUR

Abfrage der aktuellen Position ohne Positionierung.

0L

SEEK_END

Positionieren auf Dateiende.

Binärdateien (PAM, INCORE)

Mögliche Werte:

offset

Anzahl der Bytes, um die der aktuelle Lese-/Schreibzeiger verschoben werden soll, und zwar

  • positive Zahl: Vorwärts positionieren Richtung Dateiende
  • negative Zahl: Rückwärts positionieren Richtung Dateianfang
  • 0L: absolut Positionieren auf Dateianfang bzw. -ende.

whence

Bei absoluter Positionierung auf Dateianfang oder -ende, Zielpunkt, auf den der Lese-/Schreibzeiger verschoben werden soll und bei relativer Positionierung, Bezugspunkt, von dem aus der Lese-/Schreibzeiger um offset Bytes verschoben werden soll:
SEEK_SET (Dateianfang)
SEEK_CUR (aktuelle Position)
SEEK_END (Dateiende)

Sinnvolle Kombinationsmöglichkeiten und Wirkung:

offset

whence

Wirkung

0L

SEEK_SET

Positionieren auf Dateianfang.

0L

SEEK_CUR

Abfrage der aktuellen Position ohne Positionierung.

0L

SEEK_END

Positionieren auf Dateiende.

positive Zahl

SEEK_SET

Vorwärts positionieren ab Dateianfang,

SEEK_CUR

ab aktueller Position,

SEEK_END

ab Dateiende (über das Dateiende hinaus).

negative Zahl

SEEK_CUR

Rückwärts positionieren ab aktueller Position

SEEK_END

ab Dateiende.

tell/lseek-Wert

SEEK_SET

Positionieren auf die durch einen tell() oder lseek-Aufruf gemerkte Position.

(Ende)

Returnwert

neuer Wert des Lese-/Schreibzeigers, gemessen in Bytes vom Anfang der Datei,



bei Erfolg.


(off_t) -1

bei Fehler. errno wird gesetzt, um den Fehler anzuzeigen. Der Wert des Lese-/Schreibzeigers bleibt unverändert.


BS2000
neuer Wert des Lese-/Schreibzeigers, gemessen in Bytes vom Anfang der Datei, bei Binärdateien,



bei Erfolg.


absolute Position in Textdateien



bei Erfolg. (Ende)


-1

bei Fehler.

Fehler

lseek() und lseek64() schlagen fehl, wenn gilt: 

 

EBADF

fildes ist kein offener Dateideskriptor.

 

EINVAL

whence besitzt keinen erlaubten Wert, oder die sich ergebende Dateiposition wäre nicht zulässig.

 

ESPIPE

fildes ist einer Pipe oder FIFO zugeordnet.

 

EOVERFLOW

Der resultierende Datei-Offset kann in der Struktur, auf die offset zeigt, nicht korrekt dargestellt werden.

Hinweise

Ob eine BS2000- oder eine POSIX-Datei erzeugt wird, hängt von der Programmumgebung
ab.

BS2000
Die Aufrufe lseek(stream, 0L, SEEK_CUR) und tell(stream) 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 Anfügen) und erfolgt ein lseek-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 Zeilenendezeichen abschließen, bewirkt lseek() keinen Zeilenwechsel bzw. Satzwechsel. D.h., die Daten werden beim Schreiben aus dem Puffer nicht automatisch mit einem Zeilenendezeichen abgeschlossen. Nachfolgende Daten verlängern den Satz in der Datei. Beim Lesen einer ISAM-Datei werden daher nur Zeilenendezeichen eingelesen, die vom Programm explizit geschrieben wurden.

Wird bei einer Binärdatei hinter das Dateiende positioniert, entsteht ein Lücke zwischen den letzten physisch gespeicherten Daten und den neu geschriebenen Daten. Lesen aus dieser Lücke liefert binäre Nullen.

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

-

(Ende)

Siehe auch

fseek(), ftell(), open(), tell(), sys/types.h, unistd.h.