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 :

Structure fpos_t

Entête à inclure

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

Structure fpos_t

 1 
 2 
 3 
 4 
typedef struct {
  __off_t __pos;
  __mbstate_t __state;
} fpos_t;
La structure fpos_t

Ce type représente une position à l'intérieur d'un flux. Une telle position peut récupérée par la fonction fgetpos ou modifiée via la fonction fsetpos.

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

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 characters suivants dans un fichier.
void readAndDisplayFiveLetters(FILE * file) {
    // On initialize 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 maitenant 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 structure fpos_t

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

Hello
Hello
World

Conformité

C89 / C99 / C11 / C18

Sujets connexes

fgetpos
fseek
fsetpos
ftell
rewind