FTELL |
Dire la position dans le fichier |
---|---|
Langage C++ | cstdio (stdio.h) |
Syntaxe
long ftell(FILE *ptrfichier) |
Paramètres
Nom | Description |
---|---|
ptrfichier | Ce paramètre permet d'indiquer l'identificateur de fichier |
Description
Cette fonction permet de connaître la position du pointeur de fichier.
Remarques
- La fonction ftell() renvoie la valeur actuelle de l'indicateur de position de fichier pour le flux de données spécifié. Dans le cas des flux de données binaires, la valeur est le nombre d'octets de l'indicateur depuis le début du fichier. Pour les flux de texte, la valeur de retour peut ne pas être significative, sauf en tant que paramètre de fseek() en raison de la conversion de caractères possibles, telles que le retour de chariot et le saut de ligne étant substitué aux sauts de ligne, affectant la taille apparente du fichier.
- La fonction ftell() renvoie -1 lorsqu'une erreur se produit. Si le flux de données est incapable de recherches aléatoires - s'il s'agit d'un modem, par exemple - la valeur de retour n'est pas définie.
- Fonctionnalité et utilité : La fonction ftell est utilisée pour obtenir la position actuelle du pointeur de fichier dans un flux ouvert. Elle renvoie un long int représentant le déplacement en octets depuis le début du fichier. Cela permet de sauvegarder la position actuelle pour un repositionnement ultérieur avec fseek.
- Retour et gestion d'erreurs : En cas de succès, ftell retourne la position actuelle du fichier sous forme d'un entier long. En cas d'échec (par exemple, si le fichier n'est pas valide), elle retourne -1L. Dans ce cas, il est recommandé d'utiliser perror() ou de vérifier errno pour diagnostiquer l'erreur.
- Portabilité et limites sur les grandes fichiers : Sur certaines plateformes, ftell peut ne pas fonctionner correctement avec des fichiers dépassant 2 Go si long int est limité à 32 bits. Pour gérer de grands fichiers, on utilise souvent ftello (disponible sur certaines implémentations POSIX), retournant un off_t potentiellement plus large.
- Relation avec fseek : ftell est souvent utilisé en conjonction avec fseek. Par exemple, on peut utiliser ftell pour enregistrer une position, effectuer des opérations de lecture/écriture, puis utiliser fseek pour revenir à cette position enregistrée. Cela est particulièrement utile pour naviguer efficacement dans un fichier.
- Différence entre fichiers texte et binaires : Dans les fichiers binaires, ftell donne généralement un offset précis en octets. Cependant, dans les fichiers texte, la valeur retournée peut ne pas toujours correspondre à un déplacement exact en octets, notamment à cause des conversions de fin de ligne (\n transformé en \r\n sous Windows, par exemple).
- Utilisation avec un fichier non positionnable : ftell ne fonctionne pas correctement sur certains types de flux non seekables, comme stdin ou stdout, où il peut retourner -1L car ces flux ne prennent pas en charge le repositionnement. Il est donc préférable de vérifier le type du fichier avant d'utiliser ftell.
Exemples
Prenons pour acquis que le fichier «readtext.txt» est le contenu :
GGGGGGLLLLLLLAAAAAADDDDDDIIIIIRRRRRVoici un exemple positionnement aléatoire utilisant cette fonction pour connaitre la position actuel :

- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
-
- int main()
- {
- FILE * Handle = fopen("readtext.txt", "r");
- if(Handle != NULL) {
- char Temp[4];
- int I;
- Temp[3] = 0;
- for(I = 0; I <= 3; I++) {
- fpos_t P;
- P.__pos = (rand() % 10) * 3;
- fsetpos(Handle,&P);
- fread(&Temp,3,1,Handle);
- int P2 = ftell(Handle);
- std::cout << "Position courante " << P2 << ", passage " << I << ", bloc lue :" << Temp << std::endl;
- }
- fclose(Handle);
- }
- return 0;
- }
on obtiendra le résultat semblable suivant :
Position courante 6, passage 0, bloc lue :GGGPosition courante 24, passage 1, bloc lue :DDD
Position courante 15, passage 2, bloc lue :LAA
Position courante 3, passage 3, bloc lue :GGG
Cet exemple ouvre un fichier, affiche sa position initiale, lit quelques caractères, puis affiche la nouvelle position après la lecture :
- #include <cstdio>
-
- int main() {
- FILE *file = fopen("example.txt", "r");
- if (!file) return 1;
-
- fpos_t pos;
- if (fgetpos(file, &pos) == 0) {
- printf("Position initiale enregistrée.\n");
- }
-
- // Lire quelques caractères
- char buffer[10];
- fread(buffer, 1, 5, file);
-
- // Restaurer la position
- if (fsetpos(file, &pos) == 0) {
- printf("Position restaurée.\n");
- }
-
- fclose(file);
- return 0;
- }
Voir également
Langage de programmation - C++ - Référence de procédures et fonctions - fgetpos
Langage de programmation - C++ - Référence de procédures et fonctions - fseek
Langage de programmation - C++ - Référence de procédures et fonctions - fsetpos
Langage de programmation - C++ - Référence de procédures et fonctions - rewind
Langage de programmation - C - Référence de procédures et fonctions - ftell
Références
Langage C, Edition Micro-Application, Gehard Willms, 2001, ISBN: 2-7429-2008-0, page 732.
Borland C++ for Windows 4.0, Library Reference, Edition Borland, 1993, Part # BCP1240WW21772, page 118.