#include <stdio.h> // <cstdio> en C++
int fseek( FILE * stream, long offset, int whence );
Cette fonction permet de modifier la position courante de la tête de lecture sur un fichier binaire (ou plus généralement la position courante dans un flux binaire). La position peut être exprimée en fonction de différents référentiels, un référentiel étant spécifié dans le troisième paramètre. Voici les valeurs supportées pour ce référentiel.
Macro | Valeur associée | Description |
---|---|---|
SEEK_SET | 0 | La position est exprimée à partir du début du fichier. La position doit donc être positive. |
SEEK_CUR | 1 | La position est exprimée à partir de la position courante. La position peut donc être positive ou négative. |
SEEK_END | 2 | La position est exprimée à partir de la fin du fichier. La position doit donc être négative. |
ftell
et fseek
,
serait d'utiliser les fonctions fgetpos
et fsetpos
.
Si tout se passe bien, cette fonction renvoit la valeur 0.
Dans le cas contraire, une valeur non nulle sera retourné et la variable globale errno
contiendra
alors le code d'erreur.
FILE *
) passé en paramètre est invalide.whence
) n'est pas valide.Voici un exemple de code qui relit deux fois le début d'un fichier avant de lire la suite du programme.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#include <stdio.h> #include <stdlib.h> #define BLOCK_SIZE 256 int main(void) { // On créer un fichier binaire de départ qu'on va lire par la suite. FILE * file = fopen("data.bin", "wb"); char buffer[BLOCK_SIZE]; for(int i=0; i<BLOCK_SIZE; i++) buffer[i] = i; fwrite(buffer, BLOCK_SIZE, 1, file); fclose(file); // On tente maintenant de lire le fichier à différentes positions. file = fopen("data.bin", "rb"); // Tentative de lecture du 10ième octet en partant du début. int returnCode = fseek(file, 10, SEEK_SET); if (returnCode != 0) { fprintf(stderr, "Changement de position impossible"); fclose(file); exit(EXIT_FAILURE); } int value = fgetc(file); printf("10ième octet en partant du début => %d\n", value); // Attention, une fois l'octet lu, ftell calculerait 11 !!! // Tentative de lecture de l'octet situé dix positions plus en avant, donc à la 21ième position. returnCode = fseek(file, 10, SEEK_CUR); // TODO : tester returnCode value = fgetc(file); printf("Octet 10 cases plus loin => %d\n", value); // Tentative de lecture du 10ième octet en partant de la fin. returnCode = fseek(file, -10, SEEK_END); // TODO : tester returnCode value = fgetc(file); printf("10ième octet en partant de la fin => %d\n", value); // On ferme le fichier fclose(file); return EXIT_SUCCESS; } |
Et voici les résultats affichés par l'exemple ci-dessus.
10ième octet en partant du début => 10 Octet 10 cases plus loin => 21 10ième octet en partant de la fin => 246
C89 / C99 / C11 / C18
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :