Einleitung: Warum die Arbeit mit dem Dateisystem in C++ grundlegend ist
\n\nJedes ernsthafte Programm steht früher oder später vor der Notwendigkeit, Daten auf der Festplatte zu speichern oder von dort zu lesen. Konfigurationsdateien, Logs, Datenbanken, Benutzerdokumente – all dies erfordert die Fähigkeit, mit dem Dateisystem zu interagieren. In C++ gibt es dafür zwei Hauptansätze: die klassischen Ein-/Ausgabeströme (Bibliothek <fstream>) und das modernere, höherwertige std::filesystem (ab C++17).
In diesem Artikel behandeln wir praktische Szenarien: vom einfachen Lesen und Schreiben von Textdateien bis zur Navigation durch Verzeichnisse und Fehlerbehandlung. Alle Beispiele sind in C++17/20 geschrieben und bereit für den Einsatz in Ihren Projekten.
\n\n1. Grundlagen: Lesen und Schreiben von Dateien mit fstream
\n\nDie Bibliothek <fstream> bietet drei Hauptklassen: ifstream (Eingabestrom – Lesen), ofstream (Ausgabestrom – Schreiben) und fstream (bidirektionaler Strom). Betrachten wir sie anhand von Beispielen.
1.1. Schreiben in eine Textdatei
\n\nDer einfachste Weg, Daten zu schreiben, ist die Verwendung von ofstream. Wenn die Datei nicht existiert, wird sie erstellt. Wenn sie existiert, wird sie überschrieben (Standardmodus ios::trunc).
#include <iostream>\n#include <fstream>\n#include <string>\n\nint main() {\n std::ofstream outFile("example.txt");\n if (!outFile) {\n std::cerr << "Fehler beim Öffnen der Datei zum Schreiben\\n";\n return 1;\n }\n\n outFile << "Hallo, C++ Dateisystem!\\n";\n outFile << "Zeile Nummer 2\\n";\n outFile << 42 << " — ist eine Zahl.\\n";\n\n outFile.close(); // manuelles Schließen ist nicht zwingend, aber guter Stil\n std::cout << "Daten geschrieben.\\n";\n return 0;\n}\n\n1.2. Lesen aus einer Textdatei
\n\nZum Lesen verwenden wir ifstream. Die zuverlässigste Methode ist das zeilenweise Lesen mit std::getline.
#include <iostream>\n#include <fstream>\n#include <string>\n\nint main() {\n std::ifstream inFile("example.txt");\n if (!inFile) {\n std::cerr << "Datei nicht gefunden oder kann nicht geöffnet werden\\n";\n return 1;\n }\n\n std::string line;\n while (std::getline(inFile, line)) {\n std::cout << "Gelesen: " << line << '\\n';\n }\n\n inFile.close();\n return 0;\n}\n\n1.3. Öffnungsmodi und Binärdateien
\n\nSie können die Öffnungsflags kombinieren: ios::app (Anhängen), ios::binary (Binärmodus), ios::ate (zum Ende springen). Für Binärdateien verwenden Sie die Methoden read() und write().
#include <fstream>\n#include <vector>\n\n// Beispiel: Schreiben und Lesen eines Zahlenvektors im Binärformat\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\n2. Moderner Ansatz: std::filesystem (C++17)
\n\nAb C++17 wurde das Modul <filesystem> in die Standardbibliothek aufgenommen, das die Arbeit mit Pfaden, Dateien und Verzeichnissen auf hohem Niveau und plattformunabhängig ermöglicht.
2.1. Existenzprüfung und Abrufen von Dateiinformationen
\n\nMehr