Travailler avec le système de fichiers en C++ : guide pratique

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : pourquoi travailler avec le système de fichiers en C++ est fondamental

\n\n

Tout programme sérieux doit tôt ou tard sauvegarder des données sur le disque ou les lire. Fichiers de configuration, journaux, bases de données, documents utilisateur — tout cela nécessite de savoir interagir avec le système de fichiers. En C++, il existe deux approches principales : les flux d'entrée/sortie classiques (bibliothèque <fstream>) et le std::filesystem moderne, de plus haut niveau (depuis C++17).

\n\n

Dans cet article, nous aborderons des scénarios pratiques : de la simple lecture et écriture de fichiers texte à la navigation dans les répertoires et la gestion des erreurs. Tous les exemples sont écrits en C++17/20 et prêts à être utilisés dans vos projets.

\n\n

1. Bases : lecture et écriture de fichiers avec fstream

\n\n

La bibliothèque <fstream> fournit trois classes principales : ifstream (flux d'entrée — lecture), ofstream (flux de sortie — écriture) et fstream (flux bidirectionnel). Examinons-les avec des exemples.

\n\n

1.1. Écriture dans un fichier texte

\n\n

La façon la plus simple d'écrire des données est d'utiliser ofstream. Si le fichier n'existe pas, il sera créé. S'il existe, il sera écrasé (mode ios::trunc par défaut).

\n\n
#include <iostream>\n#include <fstream>\n#include <string>\n\nint main() {\n    std::ofstream outFile("example.txt");\n    if (!outFile) {\n        std::cerr << "Erreur d'ouverture du fichier en écriture\\n";\n        return 1;\n    }\n\n    outFile << "Bonjour, système de fichiers C++ !\\n";\n    outFile << "Ligne numéro 2\\n";\n    outFile << 42 << " — est un nombre.\\n";\n\n    outFile.close(); // la fermeture manuelle n'est pas obligatoire, mais c'est une bonne pratique\n    std::cout << "Données écrites.\\n";\n    return 0;\n}
\n\n

1.2. Lecture d'un fichier texte

\n\n

Pour la lecture, nous utilisons ifstream. La méthode la plus fiable est de lire ligne par ligne avec std::getline.

\n\n
#include <iostream>\n#include <fstream>\n#include <string>\n\nint main() {\n    std::ifstream inFile("example.txt");\n    if (!inFile) {\n        std::cerr << "Fichier introuvable ou impossible à ouvrir\\n";\n        return 1;\n    }\n\n    std::string line;\n    while (std::getline(inFile, line)) {\n        std::cout << "Lu : " << line << '\\n';\n    }\n\n    inFile.close();\n    return 0;\n}
\n\n

1.3. Modes d'ouverture et fichiers binaires

\n\n

Vous pouvez combiner les drapeaux d'ouverture : ios::app (ajout), ios::binary (mode binaire), ios::ate (aller à la fin). Pour les fichiers binaires, utilisez les méthodes read() et write().

\n\n
#include <fstream>\n#include <vector>\n\n// Exemple : écriture et lecture d'un vecteur de nombres au format binaire\nvoid saveVector(const std::string& filename, const std::vector<int>& data) {\n    std::ofstream file(filename, std::ios::binary);\n    if (!file) return;\n    file.write(reinterpret_cast<const char*>(data.data()), data.size() * sizeof(int));\n}\n\nstd::vector<int> loadVector(const std::string& filename) {\n    std::ifstream file(filename, std::ios::binary);\n    if (!file) return {};\n    file.seekg(0, std::ios::end);\n    size_t size = file.tellg() / sizeof(int);\n    file.seekg(0, std::ios::beg);\n    std::vector<int> data(size);\n    file.read(reinterpret_cast<char*>(data.data()), size * sizeof(int));\n    return data;\n}
\n\n

2. Approche moderne : std::filesystem (C++17)

\n\n

Depuis C++17, la bibliothèque standard inclut le module <filesystem>, qui permet de travailler avec les chemins, fichiers et répertoires à un niveau élevé, de manière multiplateforme.

\n\n

2.1. Vérification de l'existence et obtention d'informations sur un fichier

\n\n

Plus

Blogs

Book Recommendations