fseek(3S) fseek(3S)
NAME
fseek, rewind, ftell, fseeko, fseeko64, ftello, ftello64 - Schreib-
/Lesezeiger eines Streams neu positionieren
SYNTAX
#include <stdio.h>
int fseek(FILE *stream, long int offset, int ptrname);
void rewind(FILE *stream);
long int ftell(FILE *stream);
int fseeko(FILE *stream, offt offset, int whence);
int fseeko64(FILE *stream, off64t offset, int whence);
offt ftello(FILE *stream);
off64t ftello64(FILE *stream);
BESCHREIBUNG
fseek() setzt die Position der nächsten Ein- oder Ausgabeoperation in
stream. Die neue Position ist offset Bytes (mit Vorzeichen) entfernt
vom Anfang der Datei, von der momentanen Position oder vom Dateiende,
je nachdem, ob ptrname den Wert SEEKSET, SEEKCUR oder SEEKEND hat.
Diese Werte sind in stdio.h wie folgt definiert:
SEEKSET Setzt die Position auf offset.
SEEKCUR Setzt die Position auf die momentane Position plus offset.
SEEKEND Setzt die Position auf EOF plus offset.
Wenn Ein-/Ausgabefunktionen für Wide-Characters auf stream angewendet
werden sollen, muß offset entweder 0 oder der Rückgabewert eines vor-
hergehenden ftell()-Aufrufs in stream sein, und ptrname muß SEEKSET
sein.
Mit fseek() kann der Schreib-/Lesezeiger hinter das Ende der Daten in
der Datei gesetzt werden. Wenn später an diesen Ort Daten geschrieben
werden, liefern aufeinanderfolgende Lesevorgänge in der Lücke solange
0, bis Daten in die Lücke geschrieben werden.
rewind(stream) ist identisch mit (void) fseek(stream, 0L, SEEKSET);
mit der Ausnahme, daß rewind() auch die Fehleranzeige von stream
löscht.
fseek() und rewind() löschen die EOF-Anzeige und machen die Wirkung
von ungetc() auf stream rückgängig.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
fseek(3S) fseek(3S)
Nach fseek() oder rewind() kann die nächste Operation an einer geöff-
neten Datei, welche aktualisiert wird, entweder Ein- oder Ausgabe
sein.
Wenn stream beschreibbar ist und keine gepufferten Daten in die
zugrundeliegende Datei geschrieben worden sind, bewirken fseek() und
rewind(), daß die noch nicht geschriebenen Daten in die Datei
geschrieben werden.
ftell() gibt den Offset des aktuellen Bytes zurück, und zwar relativ
zum Anfang der Datei, der der angegebene stream zugeordnet ist.
Die Funktionen fseeko() und ftello() entsprechen den modifizierten
Funktionen fseek() und ftell(), mit der Ausnahme, daß das Offset-
Argument den Typ offt hat und der Fehler EOVERFLOW sich geändert hat.
fseeko() und ftello() sind erforderlich, da fseek() und ftell() durch
den Offset-Typ long für ISO C eingeschränkt sind.
Es besteht kein funktionaler Unterschied zwischen fseeko()/ftello()
und fseeko64()/ftello64(), außer bei der Interpretation von off64t
[siehe lfs(5)].
FEHLER
Die folgenden Beschreibungen der Fehlercodes sind funktionsspezifisch.
Eine allgemeingültige Beschreibung finden Sie in introprm2(2) bzw. in
errno(5).
fseek() schlägt bei folgenden Bedingungen fehl:
EAGAIN Für den Dateideskriptor ist das ONONBLOCK-Flag gesetzt,
und der Prozeß wird beim Schreiben verzögert.
EBADF Der Dateideskriptor, der sich auf stream bezieht, ist
nicht zum Schreiben geöffnet, oder der Stream-Puffer muß
bereinigt werden, und die Datei ist nicht geöffnet.
EFBIG Es wurde versucht, in eine Datei zu schreiben, wobei die
maximale Dateigröße oder das Prozeßlimit für die Datei-
größe überschritten wurde.
EFBIG Die Datei ist eine reguläre Datei, und es wurde versucht,
Daten am oder über das Offset-Maximum hinaus zu schreiben,
das dem zugehörigen Stream zugeordnet ist.
EINTR Das Schreiben wurde durch den Empfang eines Signals unter-
brochen, und es wurden keine Daten übertragen.
EINVAL ptrname ist ein ungültiges Argument. Der sich hieraus
ergebende Dateipositionsanzeiger würde auf einen negativen
Wert gesetzt.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
fseek(3S) fseek(3S)
EIO Ein physischer Ein-/Ausgabefehler ist aufgetreten, oder
der Prozeß gehört zu einer Prozeßgruppe im Hintergrund und
versucht, auf sein Steuerungsterminal zu schreiben. TOSTOP
ist gesetzt, SIGTTOU wird vom Prozeß weder ignoriert noch
blockiert, und die Prozeßgruppe des Prozesses ist ver-
waist. Dieser Fehler kann auch abhängig von der jeweiligen
Implementierung auftreten.
ENOSPC Es ist kein freier Platz auf dem Datenträger mehr vorhanden.
EPIPE Der Dateideskriptor von stream ist mit einer Pipe oder
FIFO zugeordnet.
EPIPE Es wurde versucht, in eine Pipe oder FIFO zu schreiben,
die für keinen Prozeß zum Lesen geöffnet ist. Ein
SIGPIPE-Signal wird an den Prozeß gesendet.
ENXIO Das Gerät existiert nicht, oder auf das Gerät kann nicht
zugegriffen werden.
EOVERFLOW Der resultierende Datei-Offset würde ein Wert sein, der in
einem Objekt des Typs long nicht korrekt dargestellt wer-
den kann.
fseeko() und ftello() schlagen bei folgenden Bedingungen fehl:
EOVERFLOW Der aktuelle Datei-Offset kann in einem Objekt des Typs
offt nicht korrekt dargestellt werden.
ERGEBNIS
fseek() gibt bei ungültigem Positionieren -1 zurück, ansonsten Null.
Ungültiges Positionieren kann beispielsweise ein fseek() auf eine
Datei sein, die nicht über fopen() geöffnet wurde; insbesondere darf
fseek() nicht für ein Terminal oder für eine Datei verwendet werden,
die über popen(3S) geöffnet wurde. Nachdem ein Stream geschlossen
wurde, sind keine weiteren Operationen auf diesem Stream definiert.
HINWEISE
Obwohl im Reliant UNIX-System ein von ftell() zurückgegebener Offset
in Bytes gemessen wird und es zulässig ist, relativ zu diesem Offset
zu positionieren, erfordert die Portabilität auf andere Systeme, daß
fseek() einen direkten Offset erhält. Arithmetische Operationen an
einem Nicht-Reliant UNIX-Offset, der nicht unbedingt in Bytes gemessen
wird, können nicht immer sinnvoll ausgeführt werden.
Anwendungen, die die Schnittstellen fseeko() und ftello() verwenden,
sollten LARGEFILESOURCE als 1 definieren, die Datei <unistd.h> ein-
binden und anschließend prüfen, ob LFSLARGEFILE gleich 1 ist, um
festzustellen, ob die zusätzliche Funktionalität auch tatsächlich ver-
fügbar ist. Diese zusätzliche Funktionalität kann zwar auch verfügbar
sein, wenn LARGEFILESOURCE nicht definiert ist, jedoch nicht für
Programme, die die X/Open-Standards erfüllen.
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
fseek(3S) fseek(3S)
SIEHE AUCH
lseek(2), write(2), fopen(3S), popen(3S), stdio(3S), ungetc(3S),
unistd(4), lfs(5), stdio(5).
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98