Les programmes que nous écrivons stockent leurs données en mémoire vive (RAM), qui est une mémoire temporaire : toutes les données disparaissent lorsque le programme se termine. Pour conserver des données de manière permanente, nous devons les écrire dans des fichiers sur le disque dur.
En C++, on interagit avec les fichiers grâce au concept de flux (stream). Un flux est simplement un canal d'échange de données entre votre programme et un périphérique (clavier, écran, fichier...). Pour travailler avec des fichiers, on utilise le fichier d'en-tête <fstream>.
cin), de l'écran (cout), ou d'un fichier. Les données circulent dans le flux sous forme d'une séquence d'octets.Les trois classes de la bibliothèque fstream
La bibliothèque <fstream> met à disposition trois classes spécialisées :
| Classe | Rôle | Usage typique |
|---|---|---|
ofstream | Flux de sortie vers un fichier | Créer un fichier, écrire des données |
ifstream | Flux d'entrée depuis un fichier | Lire des données depuis un fichier |
fstream | Flux bidirectionnel (lecture + écriture) | Toutes opérations sur un fichier |
Ces trois classes sont reliées par un héritage. Voici comment elles s'articulent :
fstream car elle permet toutes les opérations. Si vous n'effectuez qu'une seule opération (uniquement lecture ou uniquement écriture), préférez ifstream ou ofstream pour plus de clarté.Opérations de base sur les fichiers
La gestion d'un fichier en C++ suit toujours le même cycle :
- Ouvrir le fichier avec
open() - Lire ou écrire des données
- Fermer le fichier avec
close()
Créer et ouvrir un fichier
Pour ouvrir un fichier, on appelle la méthode open() en précisant le nom du fichier et le mode d'ouverture.
objet_fstream.open(nom_fichier, mode);Le paramètre mode détermine comment le fichier sera utilisé. Voici les modes disponibles :
| Mode | Signification | Comportement |
|---|---|---|
ios::in | Lecture | Ouvre le fichier pour lire son contenu |
ios::out | Écriture | Ouvre (ou crée) le fichier pour écrire dedans |
ios::app | Ajout (append) | Écrit à la fin du fichier sans effacer le contenu existant |
ios::ate | À la fin | Ouvre le fichier et place le curseur en fin de fichier |
ios::trunc | Troncature | Efface le contenu du fichier s'il existe déjà |
ios::in | ios::out ouvre le fichier en lecture ET en écriture.Exemple n°1 — Créer un fichier
#include <iostream>
#include <fstream>
using namespace std;
int main() {
fstream fichier;
fichier.open("etd.txt", ios::out); // Ouvrir en écriture (crée le fichier s'il n'existe pas)
if (!fichier) {
cout << "Erreur : fichier non créé !" << endl;
} else {
cout << "Fichier créé avec succès !" << endl;
fichier.close(); // Toujours fermer le fichier après utilisation
}
return 0;
}Fichier créé avec succès !
if (!fichier) (ou if (!fichier.is_open())) permet de détecter toute erreur (fichier introuvable, permissions insuffisantes, etc.).Fermer un fichier
Quand un programme C++ se termine normalement, le système d'exploitation ferme automatiquement tous les fichiers ouverts. Cependant, il est indispensable de fermer manuellement les fichiers dès qu'on n'en a plus besoin, pour trois raisons :
- Les données écrites sont vidées (flush) et effectivement enregistrées sur le disque
- La mémoire allouée au flux est libérée
- D'autres programmes peuvent alors accéder au fichier
objet_fstream.close();Écrire des données dans un fichier
Pour écrire dans un fichier, on utilise l'opérateur d'insertion <<, exactement comme avec cout. La seule différence est qu'on remplace cout par notre objet fstream.
Exemple n°2 — Écrire dans un fichier
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
fstream fichier;
fichier.open("etd.txt", ios::out); // Ouvrir en écriture
if (!fichier) {
cout << "Erreur : impossible d'ouvrir le fichier !" << endl;
} else {
string ligne;
cout << "Saisir une chaîne de caractères : ";
getline(cin, ligne); // Lire toute la ligne saisie
fichier << ligne << endl; // Écrire dans le fichier
cout << "Données écrites avec succès !" << endl;
fichier.close();
}
return 0;
}Après exécution, si l'utilisateur saisit "Hello from my lovely Morocco", le fichier etd.txt contiendra :
Hello from my lovely Morocco
Lire des données depuis un fichier
Pour lire depuis un fichier, on utilise l'opérateur d'extraction >>, exactement comme avec cin. On peut aussi utiliser getline() pour lire une ligne entière.
fichier.eof() renvoie true quand on a atteint la fin du fichier (End Of File). On l'utilise pour savoir quand arrêter la lecture.Exemple n°3 — Lire depuis un fichier
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
fstream fichier;
fichier.open("etd.txt", ios::in); // Ouvrir en lecture
if (!fichier) {
cout << "Erreur : ce fichier n'existe pas !" << endl;
} else {
string ligne;
// Lire le fichier ligne par ligne jusqu'à la fin
while (!fichier.eof()) {
fichier >> ligne; // Lire un mot/token
cout << ligne << endl; // Afficher
}
fichier.close();
}
return 0;
}Mostafa Ismail Sara Adam
Synthèse — Récapitulatif des opérations
| Opération | Méthode / Opérateur | Exemple |
|---|---|---|
| Ouvrir un fichier | open(nom, mode) | f.open("data.txt", ios::out) |
| Fermer un fichier | close() | f.close() |
| Écrire dans un fichier | << | f << "Bonjour" |
| Lire depuis un fichier | >> ou getline() | f >> mot ou getline(f, ligne) |
| Tester la fin du fichier | eof() | while (!f.eof()) |
| Vérifier l'ouverture | is_open() ou !f | if (!f) { ... } |
Lire et réécrire un fichier
Écrivez un programme C++ qui :
- Crée un fichier
notes.txtet y écrit les notes suivantes, une par ligne :15, 12, 18, 9, 14 - Lit ensuite ce fichier et calcule la moyenne des notes
- Affiche la moyenne à l'écran
Résultat attendu :
Moyenne des notes : 13.6
- Écriture : ouvrir le fichier en mode
ios::outet écrire les notes avec<<etendl. - Lecture : rouvrir le fichier en mode
ios::in, lire chaque note avec>>dans une bouclewhile(!eof()), cumuler la somme et compter les éléments. - Calcul : diviser la somme par le nombre de notes pour obtenir la moyenne.
#include <iostream>
#include <fstream>
using namespace std;
int main() {
// Étape 1 : Écrire les notes dans le fichier
fstream fichier;
fichier.open("notes.txt", ios::out);
if (!fichier) { cout << "Erreur création fichier"; return 1; }
int notes[] = {15, 12, 18, 9, 14};
for (int i = 0; i < 5; i++) {
fichier << notes[i] << endl;
}
fichier.close();
// Étape 2 : Lire et calculer la moyenne
fichier.open("notes.txt", ios::in);
if (!fichier) { cout << "Erreur lecture fichier"; return 1; }
double somme = 0;
int note, compteur = 0;
while (fichier >> note) { // Lire jusqu'à la fin du fichier
somme += note;
compteur++;
}
fichier.close();
// Étape 3 : Afficher la moyenne
if (compteur > 0)
cout << "Moyenne des notes : " << somme / compteur << endl;
return 0;
}
Discussion (0)
Soyez le premier à laisser un commentaire !
Laisser un commentaire
Votre commentaire sera visible après modération.