La gestion des fichiers en C++

15 Aug 2021 15 Aug 2021 7691 vues ESSADDOUKI Mostafa 8 min de lecture
Introduction et syntaxe de base
1 Introduction au langage C++ 2 Entrée-sortie en C++ - cin et cout 3 Inférence de type avec le mot-clé auto en C++ 4 Classe std::string et les chaînes de caractères en C++ 5 Les structures conditionnelles (if et switch) en C++ (C++17 et C++20) 6 Les boucles en C++ (C++17 et C++20) 7 La gestion des fichiers en C++
Pointeurs et fonctions
8 Introduction aux pointeurs en C++ - Déclaration et interêts 9 Les références en C++ - déclaration et interêts 10 Les tableaux en C++ - Déclaration et interêts 11 Introduction aux fonctions en C++ 12 Passer des arguments à une fonction en C++ 13 Déclarer un paramètre const en C++ 14 Les fonctions Lambda en C++ 15 Fonctions utiles (Mathématiques et caractères) en C++
Programmation OO
16 Classes et objets en C++ 17 Spécificateurs d'accès en C++ 18 Constructeurs et destructeur d'une classe en C++ 19 Fonctions membres en C++ 20 Membres statiques d'une classe en C++ 21 Fonctions en ligne en C++ - inline 22 Fonctions et classes amies en C++ - friend 23 Surcharge des fonctions en C++ 24 Surcharge des opérateurs en C++ 25 Héritage en C++ 26 La gestion d'exceptions en C++ : déclaration, utilisation et personnalisation 27 fonctions et classes templates en C++ 28 Les nouveautés C++20 pour améliorer les templates en C++
Structures de données
29 Introduction aux structures de données 30 Les structures en C++ et la différence avec les structures en C 31 Les listes chaînées en C++ 32 Les piles en C++ 33 File d'attente en C++ 34 Arbre binaire de recherche : définition et mise en oeuvre en C++
La bibliothèque standard (STL)
35 Introduction à la bibliothèque de Template Standard STL 36 Les itérateurs en C++ - définition, déclaration et exemples 37 La classe array en C++ (bibliothèque STL) <array> 38 La classe vector de la bibliothèque STL <vector> 39 La classe deque en C++ ( Bibliothèque STL) 40 La classe list en C++ (bibliothèque STL) <list> 41 La classe stack (Pile) en C++ (bibliothèque STL) <stack> 42 La classe queue (File d'attente) en C++ (bibliothèque STL) <queue> 43 La file d'attente prioritaire (classe priority_queue) - Bibliothèque STL 44 Les ensembles en C++ (Classe set <set> - Bibliothèque STL) 45 Les dictionnaires en C++ : Classe map (Bibliothèque STL) 46 Introduction aux algorithmes de la bibliothèque STL (programmation compétitive) 47 Tri et méthodes associées en C++ - Bibliothèque STL 48 Recherche dichotomique et méthodes associées en C++ - Bibliothèque STL 49 Appliquer un prédicat ou une fonction aux éléments d'une séquence en C++ - Bibliothèque STL 50 Recherche dans une séquence et méthodes associées en C++ - Bibliothèque STL

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>.

Définition — Flux (Stream) Un flux est une abstraction représentant un canal d'entrée/sortie. Il peut s'agir du clavier (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 :

ClasseRôleUsage typique
ofstreamFlux de sortie vers un fichierCréer un fichier, écrire des données
ifstreamFlux d'entrée depuis un fichierLire des données depuis un fichier
fstreamFlux bidirectionnel (lecture + écriture)Toutes opérations sur un fichier

Ces trois classes sont reliées par un héritage. Voici comment elles s'articulent :

ios (classe de base)

iostream


ofstream
Écriture

ifstream
Lecture

fstream
Lecture + Écriture
Conseil pratique Dans ce cours, nous utilisons principalement 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 :

  1. Ouvrir le fichier avec open()
  2. Lire ou écrire des données
  3. 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.


Syntaxe C++
objet_fstream.open(nom_fichier, mode);

Le paramètre mode détermine comment le fichier sera utilisé. Voici les modes disponibles :

ModeSignificationComportement
ios::inLectureOuvre le fichier pour lire son contenu
ios::outÉcritureOuvre (ou crée) le fichier pour écrire dedans
ios::appAjout (append)Écrit à la fin du fichier sans effacer le contenu existant
ios::ateÀ la finOuvre le fichier et place le curseur en fin de fichier
ios::truncTroncatureEfface le contenu du fichier s'il existe déjà
Combiner plusieurs modes On peut combiner deux modes avec l'opérateur | (OU logique). Par exemple : 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;
}
  Sortie
Fichier créé avec succès !
Vérifier l'ouverture du fichier Toujours vérifier que le fichier s'est bien ouvert avant d'essayer de lire ou d'écrire. La condition 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

Syntaxe C++
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 :

  Contenu de etd.txt
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.

Méthode eof() La méthode 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;
}
  Sortie (si etd.txt contient les prénoms)
Mostafa
Ismail
Sara
Adam

Synthèse — Récapitulatif des opérations

OpérationMéthode / OpérateurExemple
Ouvrir un fichieropen(nom, mode)f.open("data.txt", ios::out)
Fermer un fichierclose()f.close()
Écrire dans un fichier<<f << "Bonjour"
Lire depuis un fichier>> ou getline()f >> mot ou getline(f, ligne)
Tester la fin du fichiereof()while (!f.eof())
Vérifier l'ouvertureis_open() ou !fif (!f) { ... }
 Exercice

Lire et réécrire un fichier

 Niveau : Débutant

Écrivez un programme C++ qui :

  1. Crée un fichier notes.txt et y écrit les notes suivantes, une par ligne : 15, 12, 18, 9, 14
  2. Lit ensuite ce fichier et calcule la moyenne des notes
  3. Affiche la moyenne à l'écran

Résultat attendu :

  Sortie
Moyenne des notes : 13.6

Discussion (0)

Soyez le premier à laisser un commentaire !

Laisser un commentaire

Votre commentaire sera visible après modération.