C++
VeröffentlichtRevision 1

Textdateien lesen und schreiben

Ein Dateistream verwendet eine Datei als Datenquelle oder Ausgabeziel. std::ifstream liest, std::ofstream schreibt; beide stehen in <fstream>. Ihr Destruktor schließt die Datei automatisch. Für eine überprüfbare Schreibbestätigung musst du Fehler aber vorher selbst auswerten.

Textdateien lesen und schreiben#

Dateien, Fehler und Werkzeuge · Lektion 49 von 60

Voraussetzungen: Streams, RAII. Lernziel: Du behandelst Dateipfade, Öffnungsfehler und fehlgeschlagene Schreibvorgänge.

Ein Dateistream verwendet eine Datei als Datenquelle oder Ausgabeziel. std::ifstream liest, std::ofstream schreibt; beide stehen in <fstream>. Ihr Destruktor schließt die Datei automatisch. Für eine überprüfbare Schreibbestätigung musst du Fehler aber vorher selbst auswerten.

Das Beispiel legt beispiel-notiz.txt im Arbeitsverzeichnis an. Eine vorhandene Datei desselben Namens wird überschrieben. Nutze zum Ausprobieren einen eigenen Übungsordner.

C++
1#include <fstream>2#include <iostream>3#include <string>4 5int main() {6    std::ofstream ausgabe{"beispiel-notiz.txt"};7    if (!ausgabe) {8        std::cerr << "Datei konnte nicht geoeffnet werden.\n";9        return 1;10    }11    ausgabe << "C++ lernen\nZweite Zeile\n";12    ausgabe.close();13    if (!ausgabe) {14        std::cerr << "Schreiben oder Schliessen fehlgeschlagen.\n";15        return 1;16    }17    std::ifstream eingabe{"beispiel-notiz.txt"};18    if (!eingabe) {19        return 1;20    }21    std::string zeile;22    while (std::getline(eingabe, zeile)) {23        std::cout << zeile << '\n';24    }25    if (!eingabe.eof()) {26        std::cerr << "Lesefehler\n";27        return 1;28    }29}

Pfade und Arbeitsverzeichnis#

Ein relativer Pfad wie beispiel-notiz.txt wird relativ zum aktuellen Arbeitsverzeichnis aufgelöst. Das ist nicht zwingend der Ordner der .cpp-Datei. Ein absoluter Pfad bezeichnet einen vollständigen Ort. Unter Windows musst du Backslashes in gewöhnlichen Stringliteralen verdoppeln oder Raw Strings verwenden.

std::filesystem::path aus <filesystem> modelliert Dateipfade. Der /-Operator kann Pfadteile zusammenfügen. Pfade sind keine beliebigen Textverkettungen mit geratenen Trennzeichen. Berechtigungen, fehlende Ordner und belegte Datenträger können Dateizugriffe scheitern lassen.

Öffnungsmodi#

Der normale Ausgabemodus kann vorhandene Inhalte verwerfen. std::ios::app hängt an. Binärmodus mit std::ios::binary vermeidet bestimmte Textmodusumsetzungen, etwa von Zeilenumbrüchen. Er legt kein eigenes Dateiformat fest und macht das direkte Speichern beliebiger Objektbytes nicht portabel.

Typische Leseschleife#

Schreibe while (std::getline(datei, zeile)), nicht while (!datei.eof()). EOF wird häufig erst durch einen Leseversuch festgestellt. Die falsche Bedingung kann deshalb einen zusätzlichen Durchlauf mit altem oder unbrauchbarem Inhalt erzeugen.

Übung#

Warum reicht die Prüfung direkt nach dem Öffnen einer Ausgabedatei nicht?

Lösung

Spätere Schreib- oder Schließoperationen können scheitern, etwa durch vollen Speicherplatz. Prüfe auch den endgültigen Streamzustand, bevor du erfolgreiches Speichern meldest.

Weiterlernen#

Zurück: Imports und C++20-Module · Kursübersicht · Weiter: Fehler mit throw, try und catch behandeln

Mitwirkende 1

Menschen, deren Änderungen in dieser Seite veröffentlicht wurden.

Kommentare 0

Kommentare sind für diese Seite deaktiviert.