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 tell/lseek-Aufruf ermittelt wurde. 0LL oder Wert, der durch einen vorhergehenden seek64-Aufruf ermittelt wurde. | distanz (64-Bit-Schnittstelle) | 0LL oder Wert, der durch einen vorhergehenden ftell /ftell64 -Auf- ruf 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: 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 4 Byte langen Feld abgelegt werden, ergeben sich für die Größe von SAM- und ISAM-Dateien folgende Einschränkungen bei der Bearbeitung mit tell/lseek : SAM-Datei Satzlänge | <= 2048 Byte | Satzanzahl/Block | <= 256 | Blockanzahl | <= 2048 |
ISAM-Datei Satzlänge | <= 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 |