Arbeiten mit dem Dateisystem in C++: Ein praktischer Leitfaden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum die Arbeit mit dem Dateisystem in C++ grundlegend ist

\n\n

Jedes 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).

\n\n

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\n

1. Grundlagen: Lesen und Schreiben von Dateien mit fstream

\n\n

Die Bibliothek <fstream> bietet drei Hauptklassen: ifstream (Eingabestrom – Lesen), ofstream (Ausgabestrom – Schreiben) und fstream (bidirektionaler Strom). Betrachten wir sie anhand von Beispielen.

\n\n

1.1. Schreiben in eine Textdatei

\n\n

Der 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).

\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 << "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\n

1.2. Lesen aus einer Textdatei

\n\n

Zum Lesen verwenden wir ifstream. Die zuverlässigste Methode ist das zeilenweise Lesen mit 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 << "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\n

1.3. Öffnungsmodi und Binärdateien

\n\n

Sie 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().

\n\n
#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\n

2. Moderner Ansatz: std::filesystem (C++17)

\n\n

Ab 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.

\n\n

2.1. Existenzprüfung und Abrufen von Dateiinformationen

\n\n

Mehr

Blogs

Buchempfehlungen