Maîtriser les entrées/sorties fichier en C++ : Lecture et écriture avec fstream
Jusqu'à présent, nous avons utilisé la bibliothèque standard iostream, qui fournit les méthodes cin et cout pour lire depuis l'entrée standard et écrire vers la sortie standard respectivement.
Ce tutoriel vous apprendra comment lire et écrire depuis un fichier. Cela nécessite une autre bibliothèque standard C++ appelée fstream, qui définit trois nouveaux types de données :
| N° | Type de données et description |
|---|---|
| 1 | ofstream Ce type de données représente le flux de sortie de fichier et est utilisé pour créer des fichiers et écrire des informations dans les fichiers. |
| 2 | ifstream Ce type de données représente le flux d'entrée de fichier et est utilisé pour lire des informations depuis les fichiers. |
| 3 | fstream Ce type de données représente le flux de fichier généralement, et a les capacités de ofstream et ifstream, ce qui signifie qu'il peut créer des fichiers, écrire des informations dans les fichiers, et lire des informations depuis les fichiers. |
Pour effectuer le traitement de fichiers en C++, les fichiers d'en-tête <iostream> et <fstream> doivent être inclus dans votre fichier source C++.
Ouverture d'un fichier
Un fichier doit être ouvert avant de pouvoir en lire ou y écrire. Soit un objet ofstream soit fstream peut être utilisé pour ouvrir un fichier en écriture. Et un objet ifstream est utilisé pour ouvrir un fichier en lecture seulement.
Voici la syntaxe standard pour la fonction open(), qui est un membre de fstream, ifstream et ofstream.
void open(const char *filename, ios::openmode mode);
Ici, le premier argument spécifie le nom et l'emplacement du fichier à ouvrir et le second argument de la fonction membre open() définit le mode dans lequel le fichier doit être ouvert.
| N° | Drapeau de mode et description |
|---|---|
| 1 | ios::app Mode ajout. Toute sortie vers ce fichier sera ajoutée à la fin. |
| 2 | ios::ate Ouvre un fichier en sortie et déplace le contrôle de lecture/écriture à la fin du fichier. |
| 3 | ios::in Ouvre un fichier en lecture. |
| 4 | ios::out Ouvre un fichier en écriture. |
| 5 | ios::trunc Si le fichier existe déjà, son contenu sera tronqué avant l'ouverture du fichier. |
Vous pouvez combiner deux ou plusieurs de ces valeurs en les OUant ensemble. Par exemple, si vous voulez ouvrir un fichier en mode écriture et le tronquer s'il existe déjà, la syntaxe sera :
ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc);
De manière similaire, vous pouvez ouvrir un fichier pour lecture et écriture comme suit :
fstream afile;
afile.open("file.dat", ios::out | ios::in);
Fermeture d'un fichier
Lorsqu'un programme C++ se termine, il vide automatiquement tous les flux, libère toute la mémoire allouée et ferme tous les fichiers ouverts. Mais c'est toujours une bonne pratique qu'un programmeur ferme tous les fichiers ouverts avant la terminaison du programme.
Voici la syntaxe standard pour la fonction close(), qui est un membre de fstream, ifstream et ofstream.
void close();
Écriture dans un fichier
En programmation C++, vous écrivez des informations dans un fichier depuis votre programme en utilisant l'opérateur d'insertion de flux (<<) tout comme vous utilisez cet opérateur pour afficher des informations à l'écran. La seule différence est que vous utilisez un objet ofstream ou fstream au lieu de l'objet cout.
Lecture depuis un fichier
Vous lisez des informations depuis un fichier dans votre programme en utilisant l'opérateur d'extraction de flux (>>) tout comme vous utilisez cet opérateur pour saisir des informations depuis le clavier. La seule différence est que vous utilisez un objet ifstream ou fstream au lieu de l'objet cin.
Exemple de lecture et écriture
Voici le programme C++ qui ouvre un fichier en mode lecture et écriture. Après avoir écrit les informations saisies par l'utilisateur dans un fichier nommé afile.dat, le programme lit les informations du fichier et les affiche à l'écran :
#include <fstream>
#include <iostream>
using namespace std;
int main() {
char data[100];
// ouvrir un fichier en mode écriture
ofstream outfile;
outfile.open("afile.dat");
cout << "Écriture dans le fichier" << endl;
cout << "Entrez votre nom : ";
cin.getline(data, 100);
// écrire les données saisies dans le fichier
outfile << data << endl;
cout << "Entrez votre âge : ";
cin >> data;
cin.ignore();
// écrire à nouveau les données saisies dans le fichier
outfile << data << endl;
// fermer le fichier ouvert
outfile.close();
// ouvrir un fichier en mode lecture
ifstream infile;
infile.open("afile.dat");
cout << "Lecture depuis le fichier" << endl;
infile >> data;
// afficher les données à l'écran
cout << data << endl;
// lire à nouveau les données du fichier et les afficher
infile >> data;
cout << data << endl;
// fermer le fichier ouvert
infile.close();
return 0;
}
Lorsque le code ci-dessus est compilé et exécuté, il produit l'exemple d'entrée et sortie suivant :
$ ./a.out Écriture dans le fichier Entrez votre nom : Zara Entrez votre âge : 9 Lecture depuis le fichier Zara 9
Les exemples ci-dessus font usage de fonctions supplémentaires de l'objet cin, comme la fonction getline() pour lire la ligne depuis l'extérieur et la fonction ignore() pour ignorer les caractères supplémentaires laissés par l'instruction de lecture précédente.
Pointeurs de position de fichier
istream et ostream fournissent tous deux des fonctions membres pour repositionner le pointeur de position de fichier. Ces fonctions membres sont seekg (« seek get ») pour istream et seekp (« seek put ») pour ostream.
L'argument de seekg et seekp est normalement un entier long. Un second argument peut être spécifié pour indiquer la direction de recherche. La direction de recherche peut être ios::beg (par défaut) pour le positionnement relatif au début d'un flux, ios::cur pour le positionnement relatif à la position courante dans un flux ou ios::end pour le positionnement relatif à la fin d'un flux.
Le pointeur de position de fichier est une valeur entière qui spécifie l'emplacement dans le fichier comme un nombre d'octets depuis l'emplacement de départ du fichier. Quelques exemples de positionnement du pointeur de position « get » :
// positionner au n-ième octet de fileObject (suppose ios::beg) fileObject.seekg(n); // positionner n octets en avant dans fileObject fileObject.seekg(n, ios::cur); // positionner n octets en arrière depuis la fin de fileObject fileObject.seekg(n, ios::end); // positionner à la fin de fileObject fileObject.seekg(0, ios::end);
Langue C
- Maîtriser les variables, littéraux et constantes en C++ : Guide complet
- Classes et objets C++ : Guide pratique de la programmation orientée objet
- Fonctions amies et classes amies en C++ : Maîtriser le contrôle d'accès
- Gestion des fichiers en C : Maîtriser les E/S avec fopen, fprintf, fread et fseek
- Maîtriser les opérations sur les répertoires et fichiers en Python
- Structures C++ vs Classes : guide pratique pour développeurs embarqués
- Comprendre les fichiers d'en-tête C : Types, utilisation et bonnes pratiques
- Guide complet sur la date et l'heure en C++
- Maîtriser la surcharge en C++ : Fonctions et opérateurs expliqués