17.4. Entrées/sorties formatées en mode texte

Icône de l'outil pédagogique Introduction

Rappelons qu'un fichier texte peut être lu/écrit avec un éditeur (il est composé de caractères ASCII).

Les exemples qui suivent vont montrer qu'un programme qui manipule un fichier en accès texte est plus délicat et plus long qu’en accès binaire. Au lieu d'une ligne fwrite qui mémorise dans le fichier tout un tableau d'un coup (quelle que soit sa taille et la nature de ses éléments), il faut écrire élément après élément, voire champ après champ si les éléments sont de type structuré. C'est le prix à payer pour disposer d'un fichier consultable directement par l'utilisateur au moyen d'un éditeur...

Les fonctions d'entrées/sorties formatées dans un fichier sont identiques aux entrées/sorties conversationnelles à cette différence qu'elles possèdent un argument supplémentaire : le pointeur du fichier.

La position de lecture/écriture est la position courante du « curseur » dans le fichier. Ce curseur de fichier (ainsi nommé par analogie avec l'écran) se déplace automatiquement lors d’une lecture ou écriture.

Les principales fonctions disponibles sont les suivantes :

fprintf( fichier, codes formats et texte, valeurs );
fscanf ( fichier, codes formats, adresses );

fgets( ptr_chaine, longueur_max, fichier ); /* lecture d'une chaîne */
fputs( ptr_chaine, fichier ); /* écriture d'une chaîne */

fgetc( fichier ); /* lecture d'un caractère */
fputc( fichier, caractere ); /* écriture d'un caractère */

Nous allons voir un exemple d'écriture/lecture avec fprintf/fscanf, puis un exemple de lecture avec fgets, plus simple et plus sûre.

On a toujours intérêt à ramener le problème de lecture de fichier à un problème de traitement de chaîne de caractères (pour lequel nous disposons de nombreuses fonctions de recherche). C'est le rôle de la fonction fgets.
Par conséquent, on préfèrera toujours l'utilisation de fgets, suivie éventuellement par sscanf (ou strtok pour la recherche), à celle de fscanf (plus délicate). En particulier, la gestion de la fin de fichier est beaucoup plus simple avec fgets.