fseek
|
Défini dans l'en-tête
<stdio.h>
|
||
|
int
fseek
(
FILE
*
stream,
long
offset,
int
origin
)
;
|
||
|
#define SEEK_SET /* unspecified */
#define SEEK_CUR /* unspecified */
|
||
Définit l'indicateur de position du fichier pour le flux de fichier stream à la valeur pointée par offset .
Si le stream est ouvert en mode binaire, la nouvelle position est exactement offset octets mesurés depuis le début du fichier si origin est SEEK_SET , depuis la position actuelle du fichier si origin est SEEK_CUR , et depuis la fin du fichier si origin est SEEK_END . Les flux binaires ne sont pas tenus de supporter SEEK_END , en particulier si des octets nuls supplémentaires sont émis.
Si le stream est ouvert en mode texte, les seules valeurs prises en charge pour offset sont zéro (qui fonctionne avec n'importe quelle origin ) et une valeur renvoyée par un appel antérieur à ftell sur un flux associé au même fichier (qui ne fonctionne qu'avec origin de SEEK_SET ).
Si le stream est orienté large, les restrictions des flux texte et binaire s'appliquent (le résultat de ftell est autorisé avec SEEK_SET et un décalage nul est autorisé depuis SEEK_SET et SEEK_CUR , mais pas SEEK_END ).
En plus de modifier l'indicateur de position du fichier,
fseek
annule les effets de
ungetc
et efface le statut de fin de fichier, le cas échéant.
Si une erreur de lecture ou d'écriture se produit, l'indicateur d'erreur pour le flux ( ferror ) est défini et la position du fichier n'est pas affectée.
Table des matières |
Paramètres
| stream | - | flux de fichier à modifier |
| offset | - | nombre de caractères pour décaler la position relative à l'origine |
| origin | - | position à laquelle offset est ajouté. Peut avoir l'une des valeurs suivantes : SEEK_SET , SEEK_CUR , SEEK_END |
Valeur de retour
0 en cas de succès, valeur non nulle sinon.
Notes
Après s'être positionné à une position non finale dans un flux large, le prochain appel à toute fonction de sortie peut rendre le reste du fichier indéfini, par exemple en produisant une séquence multioctet de longueur différente.
Pour les flux de texte, les seules valeurs valides de offset sont 0 (applicable à n'importe quelle origin ) et une valeur retournée par un appel antérieur à ftell (uniquement applicable à SEEK_SET ).
POSIX permet de se positionner au-delà de la fin existante du fichier. Si une opération d'écriture est effectuée après ce positionnement, toute lecture de l'intervalle renverra des octets nuls. Lorsque cela est pris en charge par le système de fichiers, cela crée un fichier sparse .
POSIX exige également que
fseek
effectue d'abord un
fflush
s'il y a des données non écrites (mais le rétablissement de l'état de décalage est défini par l'implémentation).
POSIX spécifie que
fseek
doit renvoyer
-
1
en cas d'erreur, et définir
errno
pour indiquer l'erreur.
Sur Windows,
_fseeki64
peut être utilisé pour travailler avec des fichiers de plus de 2 Gio.
Exemple
fseek
avec vérification d'erreur :
#include <stdio.h> #include <stdlib.h> int main(void) { // Préparer un tableau de valeurs doubles. #define SIZE 5 double A[SIZE] = {1.0, 2.0, 3.0, 4.0, 5.0}; // Écrire le tableau dans un fichier. FILE * fp = fopen("test.bin", "wb"); fwrite(A, sizeof(double), SIZE, fp); fclose (fp); // Lire les valeurs doubles dans le tableau B. double B[SIZE]; fp = fopen("test.bin", "rb"); // Positionner l'indicateur de position du fichier devant la troisième valeur double. 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); // lit une valeur double printf("ret_code == %d\n", ret_code); // affiche le nombre de valeurs lues printf("B[0] == %.1f\n", B[0]); // affiche une valeur fclose(fp); return EXIT_SUCCESS; }
Sortie possible :
ret_code == 1 B[0] == 3.0
Références
- Norme C23 (ISO/CEI 9899:2024) :
-
- 7.23.9.2 La fonction fseek (p: TBD)
- Norme C17 (ISO/CEI 9899:2018) :
-
- 7.21.9.2 La fonction fseek (p : 245)
- Norme C11 (ISO/IEC 9899:2011) :
-
- 7.21.9.2 La fonction fseek (p: 336-337)
- Norme C99 (ISO/CEI 9899:1999) :
-
- 7.19.9.2 La fonction fseek (p : 302-303)
- Norme C89/C90 (ISO/CEI 9899:1990) :
-
- 4.9.9.2 La fonction fseek
Voir aussi
|
déplace l'indicateur de position du fichier vers un emplacement spécifique dans un fichier
(fonction) |
|
|
obtient l'indicateur de position du fichier
(fonction) |
|
|
retourne l'indicateur de position actuel du fichier
(fonction) |
|
|
déplace l'indicateur de position du fichier vers le début d'un fichier
(fonction) |
|
|
Documentation C++
pour
fseek
|
|