Participer au site avec un Tip
Rechercher
 

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 :

Fonction fseek

Entête à inclure

#include <stdio.h>  // <cstdio> en C++

Fonction fseek

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.
une alternative à l'utilisation de ftell et fseek, serait d'utiliser les fonctions fgetpos et fsetpos.

Paramètres

Valeur de retour

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.

Codes erreurs pouvant être retournés

Exemple de code

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;
}
Exemple d'utilisation de la fonction fseek

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

Conformité

C89 / C99 / C11 / C18

Sujets connexes

fgetpos
fpos_t
fsetpos
ftell
rewind