fseek
|
Definiert in Header
<stdio.h>
|
||
|
int
fseek
(
FILE
*
stream,
long
offset,
int
origin
)
;
|
||
|
#define SEEK_SET /* unspecified */
#define SEEK_CUR /* unspecified */
|
||
Setzt den Dateipositionsanzeiger für den Dateistrom stream auf den Wert, auf den offset zeigt.
Wenn der stream im Binärmodus geöffnet ist, ist die neue Position genau offset Bytes gemessen vom Dateianfang, wenn origin gleich SEEK_SET ist, von der aktuellen Dateiposition, wenn origin gleich SEEK_CUR ist, und vom Dateiende, wenn origin gleich SEEK_END ist. Binäre Streams müssen SEEK_END nicht unterstützen, insbesondere wenn zusätzliche Nullbytes ausgegeben werden.
Wenn der stream im Textmodus geöffnet ist, sind die einzigen unterstützten Werte für offset null (was mit jedem origin funktioniert) und ein Wert, der von einem früheren Aufruf von ftell auf einem Stream zurückgegeben wurde, der mit derselben Datei assoziiert ist (was nur mit origin von SEEK_SET funktioniert).
Wenn der stream weit-orientiert ist, gelten die Einschränkungen sowohl für Text- als auch für Binärströme (das Ergebnis von ftell ist mit SEEK_SET und Null-Offset erlaubt von SEEK_SET und SEEK_CUR , aber nicht SEEK_END ).
Zusätzlich zum Ändern der Dateipositionsanzeige setzt
fseek
die Effekte von
ungetc
zurück und löscht den End-of-File-Status, falls zutreffend.
Wenn ein Lese- oder Schreibfehler auftritt, wird der Fehlerindikator für den Stream ( ferror ) gesetzt und die Dateiposition bleibt unverändert.
Inhaltsverzeichnis |
Parameter
| stream | - | Dateistrom, der zu modifizieren ist |
| offset | - | Anzahl der Zeichen, um die die Position relativ zum Ursprung verschoben wird |
| origin | - | Position, zu der offset addiert wird. Kann einen der folgenden Werte annehmen: SEEK_SET , SEEK_CUR , SEEK_END |
Rückgabewert
0 bei Erfolg, andernfalls ein Wert ungleich Null.
Hinweise
Nach dem Positionieren an einer Nicht-End-Position in einem breiten Stream kann der nächste Aufruf einer Ausgabefunktion den Rest der Datei undefiniert machen, z.B. durch Ausgeben einer Multibyte-Sequenz mit einer anderen Länge.
Für Textströme sind die einzigen gültigen Werte von offset entweder 0 (anwendbar auf jeden origin ) oder ein von einem früheren Aufruf von ftell zurückgegebener Wert (nur anwendbar auf SEEK_SET ).
POSIX erlaubt das Positionieren über das bestehende Dateiende hinaus. Wenn nach diesem Positionieren eine Ausgabe durchgeführt wird, gibt jedes Lesen aus der Lücke Nullbytes zurück. Falls vom Dateisystem unterstützt, erzeugt dies eine sparse file .
POSIX verlangt außerdem, dass
fseek
zuerst einen
fflush
durchführt, falls ungeschriebene Daten vorhanden sind (ob jedoch der Schiftzustand wiederhergestellt wird, ist implementierungsdefiniert).
POSIX legt fest, dass
fseek
bei einem Fehler
-
1
zurückgeben und
errno
auf den entsprechenden Fehlercode setzen soll.
Unter Windows kann
_fseeki64
verwendet werden, um mit Dateien größer als 2 GiB zu arbeiten.
Beispiel
fseek
mit Fehlerüberprüfung:
#include <stdio.h> #include <stdlib.h> int main(void) { // Prepare an array of double values. #define SIZE 5 double A[SIZE] = {1.0, 2.0, 3.0, 4.0, 5.0}; // Write array to a file. FILE * fp = fopen("test.bin", "wb"); fwrite(A, sizeof(double), SIZE, fp); fclose (fp); // Read the double values into array B. double B[SIZE]; fp = fopen("test.bin", "rb"); // Set the file position indicator in front of third double value. if (fseek(fp, sizeof(double) * 2L, SEEK_SET) != 0) { fprintf(stderr, "fseek() failed in file %s at line # %d\n", __FILE__, __LINE__ - 2); fclose(fp); return EXIT_FAILURE; } int ret_code = fread(B, sizeof(double), 1, fp); // reads one double value printf("ret_code == %d\n", ret_code); // prints the number of values read printf("B[0] == %.1f\n", B[0]); // prints one value fclose(fp); return EXIT_SUCCESS; }
Mögliche Ausgabe:
ret_code == 1 B[0] == 3.0
Referenzen
- C23-Standard (ISO/IEC 9899:2024):
-
- 7.23.9.2 Die fseek-Funktion (S.: TBD)
- C17-Standard (ISO/IEC 9899:2018):
-
- 7.21.9.2 Die fseek-Funktion (S: 245)
- C11-Standard (ISO/IEC 9899:2011):
-
- 7.21.9.2 Die fseek-Funktion (S: 336-337)
- C99-Standard (ISO/IEC 9899:1999):
-
- 7.19.9.2 Die fseek-Funktion (S: 302-303)
- C89/C90 Standard (ISO/IEC 9899:1990):
-
- 4.9.9.2 Die fseek-Funktion
Siehe auch
|
bewegt den Dateipositionszeiger an eine bestimmte Position in einer Datei
(Funktion) |
|
|
ermittelt den Dateipositionszeiger
(Funktion) |
|
|
gibt den aktuellen Dateipositionszeiger zurück
(Funktion) |
|
|
bewegt den Dateipositionszeiger an den Anfang einer Datei
(Funktion) |
|
|
C++-Dokumentation
für
fseek
|
|