Flots sur disques et fichiers

Les lectures et écritures sur disques sont évidemment un aspect essentiel des entrées-sorties. On dispose pour cela de quatre classes fstreambase, ifstream, ofstream et fstream équivalant à ios, istream, ostream et iostream respectivement. Ces quatre classes sont définies dans le fichier <fstream.h>, qu’il faut donc inclure dans votre programme si vous souhaitez les utiliser (cela inclut automatiquement <iostream.h>).

Le tampon utilisé par ces classes est de type filebuf, qui est une dérivation de streambuf adaptée aux fichiers disques. Cette classe se charge notamment des opérations de bas niveau.

La classe fstreambuf sert surtout de classe de base pour les trois autres. Elle implémente notamment les fonctions open et close décrites ci-après pour les classes dérivées.

La classe ofstream sert pour les fichiers de sortie. Elle comprend essentiellement les méthodes suivantes :

class ofstream : public fstreambase, public ostream {     public:     ofstream();     ofstream(const char*, int = ios::out,              int = filebuf::openprot);     ~ofstream();     void open(const char*, int = ios::out,                 int = filebuf::openprot);     void close();        // héritée de fstreambase en  fait};

Le constructeur par défaut ne fait rien. Lorsqu’on l’a utilisé, il faut employer la méthode open pour ouvrir le fichier, en donnant son nom complet (avec le chemin d’accès dans le système d’exploitation), et éventuellement un mode d’ouverture (par exemple ios::app si l’on ne veut pas détruire le fichier de départ, mais seulement y ajouter des éléments) ; le troisième paramètre régit le niveau de protection, il n’a pas lieu d’être changé.

Une manière plus rapide d’ouvrir un fichier consiste à employer le constructeur adéquat, ce qui permet déclaration et ouverture simultanément.

La fonction membre close, qui est en fait définie dans fstreambase, ferme le fichier en vidant le tampon. Il ne faut pas oublier de l’appeler, sans quoi des données seraient perdues. Noter toutefois que le destructeur appelle cette fonction.

Les écritures se font comme avec cout ; on notera que par défaut les fichiers sont ouverts en mode texte ; dans ce mode, les caractères '\n' sont transformés en une paire de caractères saut de ligne + retour chariot (sur DOS ou Windows) conformément aux standards texte, et inversement en lecture. Pour éviter de telles transformations catastrophiques sur des fichiers binaires, il faut positionner le bit ios::binary dans le champ de mode (deuxième paramètre de open).

La classe istream est semblable à ostream, sauf que la valeur par défaut du second paramètre de open est ios::in et qu’elle hérite de istream.

Quant à la classe fstream, elle est aussi semblable, sauf que le second paramètre de open n’a pas de valeur par défaut et doit donc être précisé impérativement.

À titre d’exemple, voici une fonction qui recopie un fichier dans un autre :

int copiefichier(char *dest, char *srce)// copie le fichier srce dans dest// renvoie 1 si ok, 0 sinon{     ifstream fi(srce, ios::in|ios::binary);     if (!fi) return 0;        // srce impossible à lire     ofstream fo(dest, ios::out|ios::binary);     if (!fo) return 0;     char tampon;     while ( fo && fi.get(tampon) )           fo.put(tampon);     return fo.good() && fi.eof();}

En fin de fonction, on teste l’état des fichiers ; normalement, le fichier de sortie doit se trouver dans un état normal (sinon c'est qu’une erreur d’écriture s’est produite), et le fichier d’entrée doit avoir ses bits fail et good positionnés, indiquant un état anormal dû à l’échec de la dernière lecture ; pour vérifier que le lecture est cependant achevée, on utilise la fonction eof. On notera que les fichiers sont automatiquement fermés, puisque le compilateur appelle les destructeurs pour ces objets automatiques.

Les classes fstreambase, ofstream, ifstream et fstream occupent respectivement 74, 78, 80 et 84 octets de mémoire.

Précédent Précédent Sommaire Sommaire Suivant Suivant