17.3.2 Lecture non séquentielle : positionnement par fseek

Icône de l'outil pédagogique Lecture non séquentielle : positionnement par fseek
Le programmeur qui veut lire les données d'un fichier séquentiellement, du premier au dernier octet, utilise la lecture séquentielle par fread seul. Mais s'il veut se positionner en un point quelconque du fichier sans lire ce qui précède, afin d'accéder à une donnée particulière, la lecture séquentielle ne convient plus : il faut un accès direct (ou non séquentiel). Celui‐ci est obtenu en utilisant la fonction de positionnement fseek avant d'effectuer la lecture par fread. 

La lecture non séquentielle doit être évitée autant que possible.

En accès non séquentiel, le programmeur utilise les deux fonctions fseek et ftell :

- fseek positionne le « curseur de fichier » à une distance comptée en octets à partir du début, de la fin ou de la position courante du fichier. fseek permet donc d'indiquer « où on veut aller ».

- ftell renvoie la position courante du « curseur de fichier », comptée en octets à partir du début du fichier. ftell permet donc de « savoir où on est ». Elle est beaucoup moins utile que fseek.

Le prototype de fseek est :

int fseek (FILE *Stream, long Offset, int Origin);

Offset est le nombre d’octets du déplacement, compté algébriquement à partir de Origin.
Origin est une constante qui vaut SEEK_SET (« à partir du début du fichier ») ou SEEK_END (« à partir de la fin du fichier ») ou, plus rarement, SEEK_CUR (« à partir de la position courante »).

 

Exemple 100 : Calcul de la taille d'un fichier (supposé fermé) : fseek, ftell

Dans l’exemple suivant, le terme « enregistrement » désigne l’ensemble des informations relatives à un objet, en général (comme ici) une variable structurée complète. Le fichier ne contient que des enregistrements de formats identiques.

 

Exemple 101 : Accès non séquentiel à un fichier binaire (enregistrements)