next up previous contents index
suivant: 5.7 Lancement d'une commande monter: 5. Programmation en C précédent: 5.5 Allocation mémoire   Table des matières   Index

Sous-sections

5.6 Manipulation de fichiers

5.6.1 Fonctions de la librairie C

La librairie C standard permet de manipuler des fichiers (ouverture, lecture, écriture) via des pointeurs sur des flux de type FILE. Ces fonctions sont définies dans le fichier include <stdio.h>. Voici les principales fonctions utilisées (cf le cours de C) :
  #include <stdio.h>
  FILE *fopen( char *chemin, char *mode );
  int fclose( FILE * );
  int fprintf( FILE *, char *format, ... );
  int fwrite( void *ptr, int size, int nbelem, FILE * );
  int fread( void *ptr, int size, int nbelem, FILE * );
  int fflush( FILE * );
  int feof( FILE * );
Notez que ces fonctions existent aussi bien en C sous DOS que sous Macintosh ou UNIX. Elles doivent être utilisées si l'on désire écrire un programme portable. Dans ce cas, il est évident que l'on s'interdit l'usage de toutes les fonctionnalités propres à chaque système d'exploitation.

Note : les opérations d'entrées/sorties effectuées par les fonctions ci-dessus sont bufferisées; ainsi, l'appel à fwrite() ou fprintf() copie simplement les données dans un tampon (ou buffer), qui est vidé une fois plein vers le fichier concerné. Ceci permet d'éviter de multiplier inutilement les opérations d'entrées/sorties, souvent coûteuses. Une conséquence troublante pour le débutant est que lors de l'envoi de caractères vers l'écran, ceux ci n'apparaissent pas immédiatement, sauf si l'on force la vidange du tampon avec un retour chariot ou l'appel explicite à fflush().

5.6.2 Fichiers et descripteurs sous UNIX

Pour manipuler plus finement les fichiers UNIX, il est souvent nécessaire d'utiliser directement des appels système de plus bas niveau que ceux de la librairie C.

Le noyau UNIX maintient une table des fichiers ouverts par un processus. Le terme fichier désigne ici un flux de données unidirectionnel qui n'est pas nécessairement associé à un fichier disque.

Chaque processus dispose toujours à son lancement de trois flux de données :

1.
l' entrée standard, associée normalement au clavier du terminal de lancement;
2.
la sortie standard, associée normalement à l'écran du terminal (ou à la fenêtre de lancement);
3.
la sortie d'erreur, qui coïncide par défaut avec la sortie standard.
Nous avons vu dans la section 3.4 comment rediriger ces flux standard depuis le shell.

Un programme accède aux flux de données ouverts en spécifiant des descripteurs, qui sont simplement des nombre entiers correspondant à l'indice du flux dans la table. La table est remplie dans l'ordre d'ouverture des fichiers, en commençant à 3 puisque les trois premiers descripteurs sont toujours occupés par les flux standards (voir figure 5.1).

Figure 5.1: Table des descripteurs d'un processus après ouverture d'un fichier TOTO. La prochain fichier ouvert se verrait attribuer le descripteur numéro 4.
bp
[height=4cm]ps/tabdesc.ps
bp

5.6.3 Appels systèmes manipulant les fichiers

  #include <sys/types.h>
  #include <sys/stat.h>
  #include <fcntl.h>
  
  int open( char *chemin, int mode, ... );
  int close( int desc );
  int read( int desc, void *ptr, int nb_octets );
  int write( int desc, void *ptr, int nb_octets );

La fonction open() ouvre un fichier en lecture ou en écriture, crée un nouveau descripteur et le retourne.

close() ferme un descripteur.

read() et write() permettent de lire ou d'écrire une zone mémoire sur un descripteur.


next up previous contents index
suivant: 5.7 Lancement d'une commande monter: 5. Programmation en C précédent: 5.5 Allocation mémoire   Table des matières   Index
Emmanuel Viennet
1999-01-05