Cours:TdFichiers

De troyesGEII
Aller à : navigation, rechercher

vers la page des TDs 1103

Éléments de correction

Td 11 Travail sur les fichiers en C++ avec eclipse


L’utilisation d’un fichier s’impose dès que l’on veut sauvegarder de l’information de manière fiable. En effet, les variables sont stockées en mémoire vive (RAM) et perdent donc obligatoirement leur contenu à l’extinction de l’ordinateur.


Utilisation des fichiers en langage C


Trois étapes obligatoires sont nécessaires pour utiliser les fichiers en langage C (comme dans beaucoup d’autres langages) :

  • ouverture du fichier
  • opérations de lecture ou d’écriture dans le fichier
  • fermeture du fichier.

En langage C, ces trois opérations utilisent un pointeur de structure FILE défini dans le header stdio.h. On commencera donc par déclarer ce pointeur:

   #include <stdio.h>
   ...
   FILE *f ;

Ouverture du fichier

Pour l’ouverture du fichier, nous utiliserons la fonction fopen définie de la façon suivante dans stdio.h:

   FILE *fopen(char *name,char *mode) ;

Le paramètre nom contient le nom du fichier à ouvrir. Le paramètre mode correspond au mode d’ouverture.

  mode                  signification
 ------- -------------------------------------------
  "w+t"    ouverture en écriture sous forme texte.
  "r+t"    ouverture en lecture sous forme texte.
  "a+t"     ouverture en ajout sous forme texte.
  "w+b"   ouverture en écriture sous forme binaire.
  "r+b"   ouverture en lecture sous forme binaire.
  "a+b"    ouverture en ajout sous forme binaire.

Le pointeur de structure FILE retourné est égal à la valeur prédéfinie NULL si l’ouverture du fichier n’a pu s’effectuer, sinon l’ouverture du fichier est effective.

Par exemple, si on désire ouvrir un fichier de nom toto.dat en lecture sous forme texte.

    ...
    f=fopen("toto.dat","r+t") ;
    if (f==NULL) {
       cout << "Erreur à l'ouverture du fichier !\n" ;
       exit(-1) ;
       /* sort du programme */
       }
    ...

Opérations d’entrée/sortie

Pour les opérations d’entrée/sortie (lecture/écriture) dans un fichier, deux modes sont possibles: le premier est le mode format texte (les fichiers contiennent du texte affichable par la commande more), le deuxième est le mode format binaire (les données sont en codage compréhensible par la machine, et donc non affichables par la commande more).

Mode format texte

Les fonctions à utiliser sont fprintf et fscanf basées sur les fonctions printf et scanf. Par exemple, la ligne d’instruction pour écrire la chaîne de caractères "Bonjour !" dans un fichier référencé par f sera la suivante :

    fprintf(f,"bonjour !\n") ;

Mode format binaire

Les fonctions à utiliser sont fwrite et fread dont la syntaxe est détaillée ci-dessous:

    fwrite(buffer, t_element, n_element, f) ;
    fread(buffer, t_element, n_element, f) ;

buffer est l’adresse du tableau contenant les informations à écrire, t_element est la taille d’un élément, n_element est le nombre d’éléments à lire ou à écrire, et f représente un pointeur de structure FILE.

Par exemple, écrivons un tableau tab de 100 entiers dans le fichier référencé par f :

    fwrite(tab, 2, 100, f) ;
    /* on écrit 100x2 octets dans le fichier référencé par f */

Mais la ligne suivante donnerait le même résultat :

    fwrite(tab, 200, 1, f) ;
    /* on écrit 1x200 octets dans le fichier référencé par f */

En fait, il faut que le produit t_enregistrement * n_enregistrement soit égal au nombre physique d’octets à transférer.

Fermeture du fichier

La fermeture d’un fichier référencé par f s’obtient en utilisant la fonction fclose:

    fclose(f) ;

Exercices

Exercice 1

- Déclarer un tableau t de 256 éléments de type caractères non signés ( unsigned char).

- Initialiser les éléments du tableau t avec la relation suivante:

       t[i]=128+127*sin(2*M_PI*i/255) ;

La constante M_PI (qui vaut Échec d'analyse (L’exécutable <code>texvc</code> est introuvable. Lisez math/README pour le configurer.): \pi ) et la fonction sinus (sin) sont définis dans le header math.h. Il faut donc rajouter en début de programme:

   #include <math.h>
   #define _USE_MATH_DEFINES   // pour pouvoir utiliser M_PI

- Sauvegarder ce tableau dans le fichier SINUS.TXT sous forme texte et dont on vérifiera le contenu avec la commande more. Ce fichier sera constitué de lignes dont le format sera le suivant :

        Elément   0 du tableau t : 128
        Elément   1 du tableau t : 131
        ......
        Elément 255 du tableau t : 127

- Sauvegarder ce tableau dans le fichier SINUS.BIN sous forme binaire.

- Comparer la taille des fichiers. Verifier que le fichier texte a une taille plus importante que celle du fichier binaire et que l’information rangée dans ce fichier texte est encore compréhensible, ce qui n’est pas le cas avec le fichier binaire.

En résumé, on peut retenir que, pour échanger de l’information entre deux ordinateurs de type différent (par exemple, entre Windows et UNIX), le fichier en mode texte est irremplaçable malgré sa taille plus importante.

Exercice 2

Ecrire un programme de nom scan demandant le nom d’un fichier texte et calculant la fréquence d’apparition des lettres de l’alphabet constituant le fichier indiqué.

vers la page des TDs 1103