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 ftell

Entête à inclure

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

Fonction ftell

long ftell( FILE * stream );

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). Si le flux est ouvert en mode binaire, la position correspond au nombre d'octets depuis le début du fichier. Si le flux est ouvert en mode texte, alors la valeur est dépendante de l'encodage du fichier et n'aura de sens que pour sa fonction inverse fseek.

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 position courante dans le flux. La valeur sera à considérer en fonction du mode d'ouverture du fichier (binaire ou texte). Si une erreur intervient, la valeur -1L vous sera retournée et la variable errno contiendra le code de l'erreur rencontrée.

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 
#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");
    long pos;

    while((pos = ftell(file)) < BLOCK_SIZE) {
        if (pos == -1) {
            fprintf(stderr, "Cannot get the file position");
            fclose(file);
            exit(EXIT_FAILURE);
        }
        int value = fgetc(file);
        // Tel que notre fichier initial est construit, pos == value.
        printf("%ld => %d\n", pos, value);
    }

    // On ferme le fichier
    fclose(file);

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

Conformité

C89 / C99 / C11 / C18

Sujets connexes

fgetpos
fpos_t
fseek
fsetpos
rewind