Wie kann ich binäre Dateien in C korrekt öffnen, lesen und schreiben?

Melden
  1. Dateien im Binärmodus öffnen
  2. Binäre Daten lesen
  3. Binäre Daten schreiben
  4. Allgemeine Hinweise und Fehlerbehandlung
  5. Zusammenfassung

Dateien im Binärmodus öffnen

In C werden Dateien mittels der Funktion fopen() geöffnet. Um binäre Dateien zu verarbeiten, ist es wichtig, dass der Modus-String mit einem b endet. Der Binärmodus unterscheidet sich vom Textmodus darin, dass Daten byteweise unverändert gelesen und geschrieben werden, ohne Interpretation oder Umwandlung von Zeilenumbrüchen.

Zum Beispiel wird eine Datei zum Lesen im Binärmodus geöffnet mit:

FILE *datei = fopen("datei.bin", "rb");

Zum Schreiben in eine neue Datei im Binärmodus:

FILE *datei = fopen("datei.bin", "wb");

Zum Anhängen an eine bestehende Datei im Binärmodus: FILE *datei = fopen("datei.bin", "ab");

Der Modus "r" bedeutet lesen, "w" schreiben (Datei wird ggf. überschrieben) und "a" anhängen. Das b sorgt dafür, dass der Betriebssystem-abhängige Textmodus deaktiviert ist. Besonders unter Windows ist das wichtig, um z.B. Zeilenumbrüche nicht umzuwandeln.

Binäre Daten lesen

Zum Lesen von Binärdaten eignet sich die Funktion fread(). Sie liest eine festgelegte Anzahl an Elementen von einer bestimmten Größe aus einer Datei in einen Speicherpuffer ein.

Der typische Aufruf hat die Form:

size_t fread(void *ptr, size_t size, size_t count, FILE *stream);

Dabei ist ptr der Zeiger auf den Speicherbereich, size die Größe eines einzelnen Elements, count die Anzahl der Elemente, und stream die geöffnete Datei.

Ein Beispiel zum Lesen von Daten aus einer Datei könnte folgendermaßen aussehen:

FILE *datei = fopen("datei.bin", "rb");if (datei == NULL) { perror("Fehler beim Öffnen der Datei"); return 1;}unsigned char puffer ;size_t gelesen = fread(puffer, 1, sizeof(puffer), datei);if (gelesen == 0 && ferror(datei)) { perror("Fehler beim Lesen");}fclose(datei);

Im Beispiel wird ein Puffer aus 128 Bytes definiert, und fread() liest bis zu 128 Bytes. Die Funktion gibt die Anzahl der erfolgreich gelesenen Elemente zurück, hier also Bytes. Es ist wichtig, auf Fehler zu prüfen, z.B. durch ferror().

Binäre Daten schreiben

Das Schreiben von Binärdaten erfolgt ähnlich mit fwrite(), die dieselbe Parameterstruktur hat wie fread(). Damit lassen sich Blöcke von Binärdaten aus dem Speicher in die Datei schreiben.

size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);

Ein Beispiel zum Schreiben eines Puffers in eine Datei:

FILE *datei = fopen("datei.bin", "wb");if (datei == NULL) { perror("Fehler beim Öffnen der Datei"); return 1;}unsigned char daten = {0x01, 0x02, 0x03, 0x04};size_t geschrieben = fwrite(daten, 1, sizeof(daten), datei);if (geschrieben != sizeof(daten)) { perror("Fehler beim Schreiben");}fclose(datei);

Auch hier muss geprüft werden, ob die Anzahl der geschriebenen Bytes mit der erwarteten Anzahl übereinstimmt. Fehler bei fwrite() können z.B. durch Speichermedienprobleme entstehen.

Allgemeine Hinweise und Fehlerbehandlung

Beim Arbeiten mit Binärdateien in C sollten folgende Punkte beachtet werden:

Zum einen ist die Verwendung von fopen() mit dem richtigen Modus entscheidend. "rb" und "wb" sind die Standardmodi für binäres Lesen und Schreiben.

Zum anderen ist es wichtig, die Rückgabewerte von fread() und fwrite() zu überprüfen. Diese geben die tatsächlich gelesene bzw. geschriebene Elementanzahl zurück. Bei Fehlern sollten Funktionen wie perror() oder speziellere Fehlerbehandlung genutzt werden.

Die Datei sollte immer mit fclose() geschlossen werden, um Puffer zu leeren und Ressourcen freizugeben.

Falls komplexere Datenstrukturen in Dateien abgelegt werden sollen, muss darauf geachtet werden, dass beispielsweise die Byte-Reihenfolge (Endianness) berücksichtigt wird und die Struktur bytegenau definiert ist, um Plattformunabhängigkeit zu gewährleisten.

Zusammenfassung

Zusammenfassend wird eine Datei im Binärmodus mit fopen("datei.bin", "rb") oder "wb" geöffnet. Das Lesen erfolgt mit fread(), Schreiben mit fwrite(). Beide Funktionen benötigen einen Speicherpuffer, die Elementgröße und die Anzahl der Elemente. Rückgabewerte sollten auf Fehler geprüft werden, und die Datei muss anschließend unbedingt mit fclose() geschlossen werden.

0

Kommentare