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>
, quil 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. Lorsquon la utilisé, il faut employer la méthode open
pour ouvrir le fichier, en donnant son nom complet (avec le chemin daccès dans le système dexploitation), et éventuellement un mode douverture (par exemple ios::app
si lon 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 na pas lieu dêtre changé.
Une manière plus rapide douvrir 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 lappeler, 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 quelle hérite de istream
.
Quant à la classe fstream
, elle est aussi semblable, sauf que le second paramètre de open
na pas de valeur par défaut et doit donc être précisé impérativement.
À titre dexemple, 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 quune erreur décriture sest produite), et le fichier dentré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 | Sommaire | Suivant |