Prüfstand: Die Beispielprojekte wurden noch nicht mit Cargo und als GUI verifiziert. Sie sind Lernmaterial; ihre Ausführbarkeit ist noch zu prüfen.
Teil 14 – Textdateien lesen und schreiben
Lernziel: Notizen dauerhaft speichern.
Voraussetzung: Rust Desktop – Teil 13.
Dauer: etwa 20–35 Minuten einschließlich eigener Übung.
Worum geht es?
std::fs und Fehlerbehandlung. Die Lektion verwendet eine kleine, überschaubare Desktop-Anwendung, die du selbst startest, veränderst und testest. Die folgenden Schritte sind auf Windows und Linux übertragbar.
Das solltest du verstehen
std::fs::read_to_string und write liefern Result. Ein GUI darf Fehler nicht verschlucken; hier erscheint die Meldung in einer Statuszeile.
Projekt vorbereiten
Im Kursarchiv befindet sich ein vollständiges Cargo-Projekt unter beispielprojekte/teil-14/. Öffne den Ordner mit VS Code oder wechsle im Terminal hinein.
cd beispielprojekte/teil-14
cargo run
Es werden die im jeweiligen Cargo.toml festgelegten Abhängigkeiten benötigt. Die erste Kompilierung kann länger dauern. Kopiere für Experimente das Projekt in einen eigenen Arbeitsordner.
Cargo.toml
[package]
name = "rust_desktop_teil_14"
version = "0.1.0"
edition = "2024"
[dependencies]
eframe = "=0.37.0"
Vollständiges Beispiel (src/main.rs)
use eframe::egui;
#[derive(Default)]
struct DemoApp {
notes: String,
status: String,
}
impl eframe::App for DemoApp {
fn ui(&mut self, ui: &mut egui::Ui, _frame: &mut eframe::Frame) {
ui.heading("Notizen"); ui.text_edit_multiline(&mut self.notes);
if ui.button("In notizen.txt speichern").clicked() {self.status = match std::fs::write("notizen.txt", &self.notes) {Ok(()) => "Gespeichert".into(), Err(e) => e.to_string()};}
if ui.button("Aus notizen.txt laden").clicked() {match std::fs::read_to_string("notizen.txt") {Ok(t) => {self.notes=t; self.status="Geladen".into();},Err(e) => self.status=e.to_string()};}
ui.label(&self.status);
}
}
fn main() -> eframe::Result {
eframe::run_native(
"Rust Desktop – Lektion 14",
eframe::NativeOptions::default(),
Box::new(|_cc| Ok(Box::<DemoApp>::default())),
)
}
Schrittweise ausprobieren
- Starte das Beispiel mit
cargo runund beobachte, welche Elemente im Fenster erscheinen. - Suche im Quelltext die Felder von
DemoApp. Diese Daten bilden den Zustand der Anwendung. - Suche nach
impl eframe::Appund der Methodeui(). Dort wird festgelegt, was die Anwendung anzeigt. - Ändere zunächst nur einen Text oder Zahlenwert und starte die Anwendung erneut.
- Vergleiche anschließend das Verhalten nach einer Benutzereingabe mit dem gespeicherten Zustand.
Kontrollfrage: Was würde passieren, wenn du einen wichtigen Wert als lokale Variable innerhalb von ui() neu initialisierst, statt ihn in DemoApp zu speichern?
Übungsaufgabe
Füge einen Dateinamen-Check hinzu.
Versuche die Änderung zunächst ohne Musterlösung. Lies Compiler-Fehlermeldungen vollständig und prüfe zuerst die betroffene Zeile.
Musterlösung / Lösungshinweis anzeigen
Die vollständige Ausgangslösung steht im zugehörigen Cargo-Projekt. Für die Erweiterung gehst du so vor:
- Lege gegebenenfalls ein zusätzliches Feld in
DemoAppan. - Ergänze das passende Widget oder die Verzweigung in
ui(). - Übernimm nur gültige Eingabewerte und zeige Fehler verständlich an.
- Teste mindestens den normalen Ablauf und einen Grenzfall.
Erfolgskriterium: Die geforderte Änderung ist nach der Interaktion im Fenster sichtbar und verursacht keinen Absturz.
Typische Probleme
cargowird nicht gefunden: Prüfe die Rust-Installation und starte das Terminal neu.- Abhängigkeiten laden nicht: Prüfe Internetverbindung und Versionsangaben in
Cargo.toml. - Ein Compilerfehler erscheint: Kontrolliere die betroffene Zeile, Klammern und Datentypen; vermeide reflexhaft
unwrap(). - Die Änderung verschwindet: Ein zustandsrelevanter Wert gehört wahrscheinlich in
DemoApp. - Linux öffnet kein Fenster: Prüfe installierte Grafik- und Entwicklungspakete für die verwendete Distribution.
Wissenscheck
- Kannst du in eigenen Worten erklären, was dieses Beispiel demonstriert?
- Welche Daten werden in
DemoAppgespeichert und warum? - Was unterscheidet eine Benutzereingabe von einer rein grafischen Anzeige?
- Wie würdest du die Funktion ohne Hilfestellung erweitern?
Weiterlernen
← Vorherige Lektion · Kursübersicht · Nächste Lektion →
Know-How-Schmiede · Rust Desktop-Kurs. Die Beispielprojekte sind Lernmaterial und sollten vor der Veröffentlichung lokal mit deiner Werkzeugkette geprüft werden.
