Travailler avec le système de fichiers en C++ : des bases aux techniques avancées
Travailler avec le système de fichiers est l'une des tâches fondamentales du développement en C++. Qu'il s'agisse de sauvegarder les paramètres d'une application, de traiter des logs ou de créer des systèmes complexes de gestion de données — savoir lire, écrire et manipuler des fichiers et des répertoires est essentiel pour tout développeur C++. Dans cet article, nous examinerons à la fois les méthodes classiques de travail avec les fichiers via fstream et l'approche moderne utilisant la bibliothèque std::filesystem (C++17 et plus récent).
Fondamentaux du travail avec les fichiers : la bibliothèque fstream
La bibliothèque fstream (<fstream>) fournit trois classes principales pour travailler avec les fichiers :
ifstream— pour la lecture depuis un fichier (input file stream);ofstream— pour l'écriture dans un fichier (output file stream);fstream— pour la lecture et l'écriture simultanées.
Lecture de données depuis un fichier
Examinons l'exemple le plus simple d'ouverture et de lecture d'un fichier texte ligne par ligne :
#include <iostream>#include <fstream>#include <string>
int main() { std::ifstream inputFile("data.txt"); if (!inputFile.is_open()) { std::cerr << "Erreur d'ouverture du fichier !" << std::endl; return 1; }
std::string line; while (std::getline(inputFile, line)) { std::cout << line << std::endl; }
inputFile.close(); return 0;}Il est important de toujours vérifier le succès de l'ouverture du fichier à l'aide de la méthode is_open(). Le fichier se fermera automatiquement à la sortie de la portée, mais un appel explicite à close() est considéré comme une bonne pratique.
Écriture de données dans un fichier
L'écriture dans un fichier s'effectue de manière analogue à l'affichage dans la console — à l'aide de l'opérateur << :
#include <fstream>
int main() { std::ofstream outputFile("output.txt"); if (!outputFile) { std::cerr << "Impossible de créer le fichier !" << std::endl; return 1; }
outputFile << "Ligne 1" << std::endl; outputFile << "Ligne 2" << std::endl; outputFile << 42 << std::endl; // les nombres sont écrits automatiquement comme du texte
outputFile.close(); return 0;}Par défaut, ofstream écrase le fichier. Pour ajouter des données à la fin, utilisez le drapeau std::ios::app :
std::ofstream outputFile("log.txt", std::ios::app);Fichiers binaires et accès aléatoire
Pour travailler avec des données binaires, utilisez le drapeau std::ios::binary. Les méthodes read() et write() permettent de travailler avec des blocs de mémoire :
#include <fstream>
struct Record { int id; char name[50];};
int main() { // Écriture de la structure Record rec = {1, "Exemple"}; std::ofstream binOut("data.bin", std::ios::binary); binOut.write(reinterpret_cast<char*>(&rec), sizeof(rec)); binOut.close();
// Lecture de la structure Record recIn; std::ifstream binIn("data.bin", std::ios::binary); binIn.read(reinterpret_cast<char*>(&recIn), sizeof(recIn)); binIn.close();
return 0;}Pour le positionnement à l'intérieur du fichier, utilisez seekg() (pour l'entrée) et seekp() (pour la sortie) avec les paramètres std::ios::beg, std::ios::cur ou std::ios::end.
C++ moderne : la bibliothèque std::filesystem
À partir de C++17, le module std::filesystem a été intégré à la bibliothèque standard, ce qui simplifie considérablement le travail avec le système de fichiers. Il fournit des fonctions pratiques pour la manipulation des chemins, des fichiers et des répertoi