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.
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
Kommentare 0
Kommentare sind für diese Seite deaktiviert.