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 fgetpos

Entête à inclure

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

Fonction fgetpos

int fgetpos( FILE * stream, fpos_t * pos );

Cette fonction permet de récupérer la position courante de la tête de lecture sur un fichier (ou plus généralement la position courante dans un flux).

une alternative à l'utilisation de fgetpos et fsetpos, serait d'utiliser les fonctions ftell et fseek.

Paramètres

Valeur de retour

Cette fonction renvoit la valeur 0 si tout se passe bien. Dans le cas contraire, la fonction renvoit -1 et la variable globale errno contient alors le code d'erreur.

Code erreur pouvant être retourné

EBADF : le descripteur de flux (FILE *) passé en paramètre est invalide.

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 
 46 
 47 
 48 
 49 
 50 
 51 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// Une fonction qui lit les cinq caractères suivants dans un fichier.
void readAndDisplayFiveLetters(FILE * file) {
    // On initialise un buffer pour recevoir les lettres.
    char buffer[6];     // +1 pour le \0 terminal
    memset(buffer, '\0', 6);

    // On lit et on affiche les cinqs lettres.
    fread(buffer, 1, 5, file);
    puts(buffer);
}

int main(void) {

    // On créer un fichier de départ qu'on va lire par la suite.
    FILE * file = fopen("data.txt", "w");
    fprintf(file, "Hello World!\n");
    fclose(file);

    // On tente maintenant de lire le fichier, en mémorisant la position de départ.
    file = fopen("data.txt", "r");
    fpos_t pos;
    if ( fgetpos(file, &pos) != 0 ) {
        fprintf(stderr, "Cannot access to the file position");
        fclose(file);
        exit(EXIT_FAILURE);
    }

    // On lit le mot Hello
    readAndDisplayFiveLetters(file);

    // On se replace au début du fichier
    if ( fsetpos(file, &pos) != 0 ) {
        fprintf(stderr, "Cannot change the file position");
        fclose(file);
        exit(EXIT_FAILURE);
    }

    // On relit le mot Hello, puis le blanc puis World
    readAndDisplayFiveLetters(file);
    fgetc(file);
    readAndDisplayFiveLetters(file);

    // On ferme le fichier
    fclose(file);

    return EXIT_SUCCESS;
}
Exemple d'utilisation de la fonction fgetpos

Et voici les résultats affichés par ce programme.

Hello
Hello
World

Conformité

C89 / C99 / C11 / C18

Sujets connexes

fpos_t
fseek
fsetpos
ftell
rewind