10. Fichiers

Pour les systèmes d'exploitation des familles Unix-Linux, un fichier est généralement considéré comme un ensemble de bytes accédés séquentiellement. Dans la documentation, il est fréquemment question de stream (flot ou flux en français) lorsque l'on parle de ces fichiers.

Le présent chapitre traite de la manipulation des fichiers par des pointeurs sur les structures FILE et des fonctions standards qui y sont associées. L'utilisation des appels système et des file descriptors sera abordée dans le cours de Unix.

Nous verrons que le monde Unix-Linux reconnaît 2 types de fichiers : les fichiers constitués uniquement de caractères imprimables (fichiers text) et les autres (fichiers binaires).

Descripteur de fichier

Les applications C gèrent les fichiers en stockant les informations utiles (nom, count pointer, attributs, etc.) dans une structure FILE. Pour chaque application, ces structures sont stockées dans une table, où une structure peut être accédée soit par son indice, appelé file descriptor, soit par un pointeur. Les 3 premiers éléments de la table sont réservés aux flots de données standard (cf. point suivant).

Lorsqu'il est nécessaire d'utiliser un fichier particulier, la première étape est d'ouvrir le fichier pour créer et remplir une structure FILE et pour stocker celle-ci dans la table des descripteurs de fichiers. Lorsqu'on accède à la structure au moyen de son file descriptor, les opérations de lecture, écriture, etc. sont réalisées au travers des appels système propres à l'OS. Mais il est également possible de manipuler les fichiers grâce aux fonctions standards, dont les prototypes se trouvent dans le header stdio.h. Ces fonctions référencent un fichier grâce à un pointeur sur une structure FILE.

Les flots standard

Trois flots standard peuvent être utilisés en C sans qu'il soit nécessaire de les ouvrir ou de les fermer:

Notez qu'il est fortement conseillé d'afficher systématiquement les messages d'erreur sur stderr afin que ces messages apparaissent à l'écran même lorsque la sortie standard est redirigée.

Les flots de données standard sont de type FILE*. Ils occupent les trois premières places de la table des file descriptors: à l'indice 0 se trouve la structure reprenant les informations du fichier stdin (entrée standard = clavier), à l'indice 1 du fichier stdout (sortie standard = écran) et à l'indice 2 stderr (sortie des messages d'erreur = écran).

Ouverture - Fermeture

La première étape lorsqu'on désire utiliser des fichiers dans une application est l'ouverture du fichier. En C, la fonction qui réalise cette action est la fonction fopen().

Cette fonction nécessite deux paramètres: le premier, de type char*, est le nom du fichier dans le "file system" et le second, également un char*, permet de spécifier le mode d'ouverture, i.e. la façon d'exploiter le fichier. Les principaux modes sont :

S'agissant des fichiers binaires, les principaux modes d'ouverture sont :