Fichiers et Flux en C++

Bonjour, futurs programmeurs ! Aujourd'hui, nous allons entamer un voyage passionnant dans le monde des fichiers et des flux en C++. En tant que professeur de science informatique de votre quartier, je suis là pour vous guider dans cette aventure. Croquez-moi, à la fin de cette leçon, vous manipulerez des fichiers comme un pro !

C++ Files and Streams

Ouverture d'un Fichier

Commençons par les bases. Imaginez que vous avez un coffre au trésor (c'est notre fichier) et que vous devez l'ouvrir pour y mettre quelque chose ou en faire sortir quelque chose. En C++, nous utilisons quelque chose appelé un "flux" pour interagir avec les fichiers.

Pour ouvrir un fichier, nous utilisons la classe ifstream pour la lecture (entrée) et la classe ofstream pour l'écriture (sortie). Si vous souhaitez faire les deux, vous pouvez utiliser la classe fstream.

Voici comment ouvrir un fichier :

#include <fstream>
#include <iostream>
using namespace std;

int main() {
ofstream monFichier("tresor.txt");

if (monFichier.is_open()) {
cout << "Le coffre au trésor est ouvert !" << endl;
} else {
cout << "Oh non ! Nous n'avons pas pu ouvrir le coffre au trésor." << endl;
}

return 0;
}

Dans cet exemple, nous essayons d'ouvrir un fichier nommé "tresor.txt" pour l'écriture. La fonction is_open() vérifie si le fichier a été ouvert avec succès.

Fermeture d'un Fichier

Après avoir terminé avec notre coffre au trésor, il est poli (et une bonne pratique) de le fermer. En C++, les fichiers sont automatiquement fermés lorsque l'objet de flux de fichier sort de son champ d'application, mais il est préférable de les fermer explicitement :

monFichier.close();

Écriture dans un Fichier

Maintenant que nous avons notre coffre au trésor ouvert, mettons-y un peu de trésor ! Écrire dans un fichier est aussi simple que l'utilisation de l'opérateur << :

ofstream monFichier("tresor.txt");

if (monFichier.is_open()) {
monFichier << "Pièces d'or : 100" << endl;
monFichier << "Baguettes magiques : 3" << endl;
monFichier << "Oeufs de dragon : 1" << endl;
cout << "Trésor ajouté au coffre !" << endl;
} else {
cout << "Échec de l'ouverture du coffre au trésor." << endl;
}

monFichier.close();

Dans cet exemple, nous écrivons trois lignes dans notre fichier. Chaque opérateur << écrit le texte suivant dans le fichier, et endl ajoute une nouvelle ligne.

Lecture d'un Fichier

Lire un fichier est comme faire l'inventaire de notre coffre au trésor. Nous utilisons la classe ifstream et l'opérateur >> pour lire à partir d'un fichier :

#include <string>

ifstream monFichier("tresor.txt");
string ligne;

if (monFichier.is_open()) {
while (getline(monFichier, ligne)) {
cout << ligne << endl;
}
monFichier.close();
} else {
cout << "Impossible d'ouvrir le coffre au trésor." << endl;
}

Ici, nous utilisons getline() pour lire chaque ligne du fichier et l'afficher sur la console. La boucle while continue jusqu'à ce que nous atteignions la fin du fichier.

Exemple de Lecture et d'Écriture

Combienons la lecture et l'écriture dans un exemple plus complexe. Nous allons créer un programme qui gère notre inventaire de trésor :

#include <fstream>
#include <iostream>
#include <string>
using namespace std;

int main() {
// Écriture dans le fichier
ofstream outFile("inventaire.txt");
if (outFile.is_open()) {
outFile << "Pièces d'or : 100" << endl;
outFile << "Baguettes magiques : 3" << endl;
outFile << "Oeufs de dragon : 1" << endl;
outFile.close();
cout << "Inventaire enregistré !" << endl;
} else {
cout << "Impossible d'enregistrer l'inventaire." << endl;
return 1;
}

// Lecture du fichier
ifstream inFile("inventaire.txt");
string item;
int count;

if (inFile.is_open()) {
cout << "Inventaire actuel :" << endl;
while (inFile >> item >> count) {
cout << item << " " << count << endl;
}
inFile.close();
} else {
cout << "Impossible de lire l'inventaire." << endl;
return 1;
}

return 0;
}

Dans cet exemple, nous écrivons d'abord notre inventaire dans un fichier, puis le lisons et l'affichons. Notez comment nous utilisons >> pour lire des mots et des nombres séparément.

Pointeurs de Position de Fichier

Imaginez que vous lisez un livre et que vous souhaitez suivre où vous en êtes. Les pointeurs de position de fichier font exactement cela pour les fichiers. Ils gardent trace de où nous en sommes dans le fichier.

Voici quelques fonctions utiles pour travailler avec les pointeurs de position de fichier :

Fonction Description
tellg() Retourne la position actuelle du pointeur de lecture (pour l'entrée)
tellp() Retourne la position actuelle du pointeur d'écriture (pour la sortie)
seekg() Définit la position du pointeur de lecture
seekp() Définit la position du pointeur d'écriture

Voyons un exemple :

#include <fstream>
#include <iostream>
using namespace std;

int main() {
fstream fichier("carte_trésor.txt", ios::in | ios::out);

if (!fichier.is_open()) {
cout << "Échec de l'ouverture de la carte au trésor !" << endl;
return 1;
}

// Écriture dans le fichier
fichier << "X marque l'emplacement !";

// Déplacement au début du fichier
fichier.seekg(0, ios::beg);

// Lecture du contenu
string contenu;
getline(fichier, contenu);
cout << "La carte dit : " << contenu << endl;

// Déplacement de 2 caractères à partir du début
fichier.seekp(2, ios::beg);

// Écrasement d'une partie du contenu
fichier << "ne marque pas toujours";

// Déplacement au début et lecture à nouveau
fichier.seekg(0, ios::beg);
getline(fichier, contenu);
cout << "Maintenant, la carte dit : " << contenu << endl;

fichier.close();
return 0;
}

Dans cet exemple, nous écrivons dans un fichier, puis nous le lisons, puis nous modifions une partie de son contenu, et enfin, nous le lisons à nouveau. C'est comme si nous mettions à jour notre carte au trésor !

Et voilà, braves explorateurs du royaume C++ ! Vous avez appris comment ouvrir des coffres au trésor (fichiers), stocker votre butin (écrire des données), faire l'inventaire (lire des données) et même mettre à jour vos cartes au trésor (manipuler le contenu des fichiers). Rappelez-vous, la pratique fait le maître, alors continuez à coder et à explorer. Qui sait quels trésors numériques vous découvrirez ensuite ? Bon codage !

Credits: Image by storyset