#include <stdio.h> // <cstdio> en C++
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
.
ftell
et fseek
,
serait d'utiliser les fonctions fgetpos
et fsetpos
.
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.
EBADF : le descripteur de flux (FILE *
) passé en paramètre est invalide.
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; } |
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 :