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 clés dans toute application sérieuse en C++. Qu'il s'agisse de lire des fichiers de configuration, d'écrire des logs, de traiter de grands volumes de données ou de gérer des projets — savoir interagir correctement avec les fichiers et les répertoires est nécessaire pour tout développeur C++. Dans cet article, nous allons détailler les approches principales pour travailler avec le système de fichiers en C++, en commençant par les fonctions C classiques jusqu'au moderne std::filesystem, apparu en C++17.
Nous examinerons des exemples pratiques qui vous aideront non seulement à comprendre la théorie, mais aussi à appliquer immédiatement les connaissances acquises dans des projets réels. Tous les exemples de code sont testés et prêts à être utilisés.
1. Bases du travail avec les fichiers : flux d'entrée/sortie
La manière la plus courante de travailler avec des fichiers en C++ est d'utiliser la bibliothèque <fstream>. Elle fournit trois classes principales :
std::ifstream— pour la lecture depuis un fichier (input file stream);std::ofstream— pour l'écriture dans un fichier (output file stream);std::fstream— pour la lecture et l'écriture (file stream).
Lecture depuis un fichier
Pour lire des données depuis un fichier, créez un objet std::ifstream et ouvrez le fichier. La manière la plus simple de lire un fichier ligne par ligne est d'utiliser la fonction std::getline :
#include <iostream>#include <fstream>#include <string>
int main() { std::ifstream inputFile("example.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;}Notez la vérification is_open() — c'est une pratique importante qui empêche le plantage du programme si le fichier est absent.
Écriture dans un fichier
Pour écrire des données, on utilise std::ofstream. Par défaut, le fichier est créé à nouveau (mode trunc). Si vous devez ajouter des données à la fin, utilisez le drapeau std::ios::app :
#include <iostream>#include <fstream>
int main() { std::ofstream outputFile("output.txt", std::ios::app); if (!outputFile.is_open()) { std::cerr << "Erreur de création du fichier !" << std::endl; return 1; }
outputFile << "Ligne 1" << std::endl; outputFile << "Ligne 2" << std::endl; outputFile << "Nombre : " << 42 << std::endl;
outputFile.close(); return 0;}Travail avec les fichiers binaires
Pour les données binaires, utilisez les méthodes read() et write() en spécifiant la taille du bloc :
#include <iostream>#include <fstream>#include <cstring>
struct Record { int id; char name[50]; double value;};
int main() { // Écriture Record r = {1, "Enregistrement test", 3.14}; std::ofstream binOut("data.bin", std::ios::binary); binOut.write(reinterpret_cast<const char*>(&r), sizeof(r)); binOut.close();
// Lecture Record r2; std::ifstream binIn("data.bin", std::ios::binary); binIn.read(reinterpret_cast<char*>(&r2), sizeof(r2)); binIn.close();
std::cout << "ID : " << r2.id << ", Nom : " << r2.name << ", Valeur : " << r2.value << std::endl; return 0;}2. Approche moderne : la bibliothèque std::filesystem (C++17)
À partir de C++17, la bibliothèque standard a été enrichie avec <filesystem>, ce qui simplifie considérablement le travail avec le système de fichiers. O