
Jetzt arbeiten wir mit echten Dateien! Du lernst wie man mit fopen, fprintf und fscanf Daten dauerhaft auf der Festplatte speichert und wieder einliest. Das ist ein riesiger Schritt – Daten überleben jetzt das Programmende!
Modi kennen – Welcher Modus passt?
Trage in der rechten Spalte den richtigen fopen-Modus ein ("r", "w", "a" oder "r+"):
| # | Situation | Richtiger Modus |
|---|---|---|
| 1 | Du möchtest eine neue Konfigurationsdatei anlegen und Werte hineinschreiben. Eine alte Version darf überschrieben werden. | |
| 2 | Du möchtest eine bestehende Textdatei einlesen und die Daten verarbeiten. Die Datei darf nicht verändert werden. | |
| 3 | Jedes Mal wenn dein Programm startet, soll ein neuer Eintrag ans Ende der Log-Datei angefügt werden, ohne alte Einträge zu löschen. | |
| 4 | Du möchtest eine bereits existierende Datei sowohl lesen als auch an beliebigen Stellen bearbeiten. | |
| 5 | Du möchtest eine CSV-Datei mit Schüler-Noten von der Festplatte einlesen und auswerten. Die Datei wird nur gelesen. |
"r" = nur lesen, "w" = neu schreiben (überschreibt!), "a" = anhängen, "r+" = lesen und schreiben.Datei schreiben – Schüler-Datei anlegen
Vervollständige das Programm: Es soll deinen Namen und drei Noten in die Datei schueler.txt schreiben. Fülle alle markierten Lücken (???) aus.
Was steht nach dem Programmlauf in schueler.txt? Schreibe den erwarteten Inhalt hier auf:
fprintf ist der FILE-Pointer, nicht stdout!Datei lesen – schueler.txt einlesen
Schreibe ein Programm das die Datei schueler.txt aus Übung 2 einliest und den Inhalt Zeile für Zeile auf der Konsole ausgibt. Nutze fgets zum zeilenweisen Lesen.
Welche Ausgabe erwartest du auf der Konsole?
fgets(puffer, groesse, datei) liest eine ganze Zeile inklusive dem Zeilenumbruch \n in den Puffer. Gibt NULL zurück wenn das Dateiende erreicht ist.Programm schreiben – Digitales Tagebuch
Schreibe ein vollständiges Programm für ein einfaches digitales Tagebuch:
- Jedes Mal wenn das Programm startet, wird ein neuer Eintrag in
tagebuch.txtgespeichert - Der Eintrag enthält eine laufende Nummer und den Text:
"Eintrag N: Programm wurde gestartet." - Benutze den Append-Modus damit alte Einträge erhalten bleiben
- Die laufende Nummer: Lies sie zuerst aus einer eigenen Datei
zaehler.txtaus (nur eine Zahl darin). Beim ersten Mal gibt es die Datei noch nicht – starte dann bei 1. Erhöhe die Zahl und schreibe sie zurück.
Tipp: Schritt für Schritt – erst nur Anhängen ohne Zähler lösen, dann den Zähler ergänzen.
Was steht in tagebuch.txt nach dem dritten Programmstart?
"a": Die Datei wird nicht gelöscht, neuer Inhalt kommt immer ans Ende. Perfekt für Log-Dateien und Tagebücher!Fehler korrigieren – 3 Bugs im Code
Das folgende Programm enthält 3 Fehler. Finde und markiere sie, dann schreibe die korrigierte Version darunter.
#include <stdio.h> int main() { int zahl; /* Datei zum LESEN öffnen */ FILE *f = fopen("daten.txt", "w"); /* Fehler 1 */ /* Direkt verwenden ohne Prüfung */ fscanf(f, "%d", &zahl); /* Fehler 2 */ printf("Gelesen: %d\n", zahl); /* Programm endet hier ohne fclose */ return 0; /* Fehler 3 */ }
Beschreibe die drei Fehler:
Fehler 1:
Fehler 2:
Fehler 3:
Schreibe das korrigierte Programm:
Noten aus einer CSV-Datei lesen und auswerten
Eine Datei noten.csv enthält Zeilen im Format:
Anna,1,2,3 Ben,2,3,2 Clara,1,1,2 David,3,4,3
Schreibe ein C-Programm das:
- Die Datei
noten.csvöffnet und zeilenweise einliest - Für jede Zeile: Namen und drei Noten mit
sscanfoder durch Parsen trennt - Den Notendurchschnitt je Schüler berechnet und ausgibt
- Am Ende den besten Schüler (niedrigster Durchschnitt) nennt
Hinweis: Nutze fgets zum Zeilenlesen und sscanf(zeile, "%[^,],%d,%d,%d", name, &n1, &n2, &n3) zum Parsen.
Welche Ausgabe erwartest du für die Beispiel-CSV?
"%63[^,]" liest alle Zeichen bis zum ersten Komma in den Namen-Puffer. Das ist ein nützlicher Trick für CSV-Parsing in C!Reflexion
Was ich in Unit 33 gelernt habe
Beantworte kurz in eigenen Worten:
1. Warum ist fclose() so wichtig?
2. Was passiert wenn ich den NULL-Check nach fopen() weglasse und die Datei nicht existiert?
3. Wann würdest du Modus "a" statt "w" verwenden? Nenne ein eigenes Beispiel.