Historie der Fragen:
Die Arbeit mit Dateien in der Sprache C ist eine grundlegende Fähigkeit, die bereits in den frühen Umsetzungen der Sprache entstanden ist. Die Standardbibliothek C (stdio.h) bietet universelle Funktionen für die Arbeit mit Ein- und Ausgabe-Streams, die Programme portierbar zwischen verschiedenen Betriebssystemen machen.
Problematik:
Häufig machen Anfängerfehler bei der Arbeit mit Datei-Streams: Sie überprüfen nicht das Ergebnis des Dateiöffnens, verwalten den Speicher für die Pufferung falsch und behandeln Lese- oder Schreibfehler nicht. Fehler beim Schließen von Dateien führen zu Ressourcenlecks, während unsachgemäße Pufferarbeit zu Datenverlust führt.
Lösung:
Für eine korrekte Arbeit mit Dateien muss man immer:
fopen öffnen;fread, fwrite, fscanf, fprintf zum Lesen/Schreiben verwenden;fclose schließen.Beispielcode:
#include <stdio.h> int main() { FILE *fp = fopen("example.txt", "w"); if (!fp) { perror("Datei konnte nicht geöffnet werden"); return 1; } fprintf(fp, "Hallo, Welt! "); fclose(fp); fp = fopen("example.txt", "r"); if (!fp) { perror("Fehler beim Öffnen der Datei zum Lesen"); return 1; } char buffer[100]; while (fgets(buffer, sizeof(buffer), fp)) { printf("%s", buffer); } fclose(fp); return 0; }
Wesentliche Merkmale:
Kann man eine Datei mehrfach mit fclose schließen?
Nein, ein doppeltes Schließen eines Datei-Streams führt zu undefiniertem Verhalten. Nach fclose wird der Deskriptor ungültig.
Was gibt die Funktion fread zurück, wenn sie das Ende der Datei erreicht?
fread gibt die Anzahl der erfolgreich gelesenen Elemente zurück. Wenn das Ende der Datei erreicht ist, kann die zurückgegebene Zahl kleiner als erwartet sein. Man sollte immer feof und ferror zur Diagnose überprüfen.
Kann man denselben Datei-Stream gleichzeitig zum Schreiben und Lesen verwenden?
Ja, wenn die Datei im Modus "r+" oder "w+" geöffnet ist, ist es jedoch notwendig, vor dem Wechsel der Richtung (Schreiben/Lesen) fflush oder eine andere Datei-Positionsoperation (fseek) auszuführen. Andernfalls ist das Verhalten undefiniert.
FILE *-Zeiger nach fclose verwenden.fflush nicht aufgerufen, Stream nicht geschlossen).Ein Entwickler schrieb Daten in eine Log-Datei, ohne das zurückgegebene Ergebnis von fopen zu überprüfen. Nach Erschöpfung der Deskriptoren konnte die Datei nicht mehr geöffnet werden – Log-Nachrichten gingen verloren.
Vorteile:
Nachteile:
In einer anderen Version des Codes wurden immer alle Rückgabewerte (fopen, fwrite, fclose) überprüft. Bei einem Fehler wurde eine detaillierte Diagnosemeldung über perror ausgegeben, und das Programm endete korrekt, indem alle Ressourcen freigegeben wurden.
Vorteile:
Nachteile: