Übungsprojekt: Notizen dauerhaft speichern
Persistenz bedeutet, dass Daten über das Ende eines Programmlaufs hinaus erhalten bleiben. Dieses Programm verwaltet einzeilige Notizen in kurs-notizen.txt im Arbeitsverzeichnis. Neue Einträge werden angehängt. Es unterstützt Anzeigen, Hinzufügen und Beenden; bearbeitete oder gelöschte Einträge wären eine spätere Erweiterung.
Übungsprojekt: Notizen dauerhaft speichern#
Übungsprojekte · Lektion 56 von 60
Voraussetzungen: Dateien, Funktionen, Schleifen. Lernziel: Du entwickelst ein kleines Programm, dessen Daten den nächsten Start überleben.
Persistenz bedeutet, dass Daten über das Ende eines Programmlaufs hinaus erhalten bleiben. Dieses Programm verwaltet einzeilige Notizen in kurs-notizen.txt im Arbeitsverzeichnis. Neue Einträge werden angehängt. Es unterstützt Anzeigen, Hinzufügen und Beenden; bearbeitete oder gelöschte Einträge wären eine spätere Erweiterung.
Vollständiges Programm#
1#include <filesystem>2#include <fstream>3#include <iostream>4#include <string>5#include <system_error>6 7bool anzeigen(const std::filesystem::path& pfad) {8 std::error_code fehler;9 const bool vorhanden = std::filesystem::exists(pfad, fehler);10 if (fehler) {11 return false;12 }13 if (!vorhanden) {14 std::cout << "Noch keine Notizen.\n";15 return true;16 }17 std::ifstream datei{pfad};18 if (!datei) {19 return false;20 }21 std::string zeile;22 while (std::getline(datei, zeile)) {23 std::cout << "- " << zeile << '\n';24 }25 return datei.eof();26}27 28bool anhaengen(const std::filesystem::path& pfad, const std::string& text) {29 std::ofstream datei{pfad, std::ios::app};30 if (!datei) {31 return false;32 }33 datei << text << '\n';34 datei.close();35 return static_cast<bool>(datei);36}37 38int main() {39 const std::filesystem::path pfad{"kurs-notizen.txt"};40 std::string auswahl;41 while (true) {42 std::cout << "a: anzeigen, n: neue Notiz, q: Ende\n";43 if (!std::getline(std::cin, auswahl)) {44 return std::cin.eof() ? 0 : 1;45 }46 if (auswahl == "q") {47 return 0;48 }49 if (auswahl == "a") {50 if (!anzeigen(pfad)) {51 std::cerr << "Notizen konnten nicht gelesen werden.\n";52 }53 } else if (auswahl == "n") {54 std::string text;55 std::cout << "Notiz: ";56 if (!std::getline(std::cin, text)) {57 return 1;58 }59 if (text.empty() || text.size() > 1000) {60 std::cerr << "Notiz muss 1 bis 1000 Codeeinheiten enthalten.\n";61 } else if (anhaengen(pfad, text)) {62 std::cout << "Gespeichert.\n";63 } else {64 std::cerr << "Speichern fehlgeschlagen.\n";65 }66 } else {67 std::cerr << "Unbekannte Auswahl\n";68 }69 }70}Dateizustand ist kein Wahrheitswert#
std::error_code transportiert einen Fehlerwert ohne unmittelbares Werfen einer Ausnahme bei der verwendeten Dateisystemabfrage. Die Existenzprüfung unterscheidet „Datei fehlt“ von „Abfrage fehlgeschlagen“. Zwischen Prüfung und Öffnen kann sich die Datei trotzdem ändern; deshalb wird das tatsächliche Öffnen nochmals geprüft.
Das Programm meldet erst nach dem Schließen Erfolg. Ein Schreibfehler kann allerdings bereits einen Teil der neuen Zeile hinterlassen. Atomarität würde bedeuten, dass eine Änderung ganz oder gar nicht sichtbar wird. Dieses einfache Textformat bietet diese Zusage nicht und ist für einen einzelnen lokalen Übungsprozess gedacht, nicht für gleichzeitig schreibende Programme.
Testfolge#
Starte in einem leeren Übungsordner. Zeige die Liste an, füge C++ weiterlernen hinzu und beende das Programm. Starte es im selben Arbeitsverzeichnis erneut: Die Notiz muss vorhanden sein. Prüfe außerdem eine leere Notiz und einen nicht beschreibbaren Speicherort.
Erweiterungsaufgabe#
Wie würdest du ein Löschen anhand einer Nummer vorbereiten?
Lösungsidee
Lies die vorhandenen Zeilen in einen Vector, prüfe die eingegebene Position und schreibe die neue Fassung zunächst in eine getrennte temporäre Datei. Erst nach geprüftem Schreiben folgt ein zur Zielplattform passender Austausch. Überschreibe nicht voreilig die einzige vorhandene Datei, bevor alle Schritte erfolgreich waren.
Weiterlernen#
Zurück: Übungsprojekt: ein geprüfter Taschenrechner · Kursübersicht · Weiter: Übungsprojekt: Dateiinhalt auswerten
Kommentare 0
Kommentare sind für diese Seite deaktiviert.