Lesen einer Binärdatei in C

Jinku Hu 12 Oktober 2023
  1. Verwendung von die Funktion fread zum Lesen einer Binärdatei in C
  2. Verwenden der Funktion read zum Lesen von Binärdateien in C
Lesen einer Binärdatei in C

Dieser Artikel demonstriert mehrere Methoden, wie eine Binärdatei in C gelesen werden kann.

Verwendung von die Funktion fread zum Lesen einer Binärdatei in C

Die Funktion fread ist Teil der Ein-/Ausgabefunktionen der C-Standardbibliothek und kann verwendet werden, um Binärdaten aus regulären Dateien zu lesen. Die C-Standardbibliothek implementiert eine benutzergepufferte E/A zusammen mit einer plattformunabhängigen Lösung für das Lesen/Schreiben von binären Dateidaten. Die Standard-E/A-Funktionen arbeiten mit Dateizeigern anstelle von Dateideskriptoren. FILE*-Streams werden von der Funktion fopen abgerufen, die den Dateipfad als String-Konstante und den Modus zum Öffnen übernimmt. Der Modus der Datei gibt an, ob eine Datei zum Lesen, Schreiben oder Anhängen geöffnet werden soll. Beachten Sie jedoch, dass jede Modus-Zeichenkette den Buchstaben b enthalten kann, um explizit einen binären Dateimodus anzugeben, der von einigen Nicht-UNIX-Systemen, die Text- und Binärdateien unterschiedlich behandeln, interpretiert werden kann.

Nachdem fopen den Dateizeiger zurückgegeben hat, können wir die Funktion fread aufrufen, um den Binärstrom zu lesen. fread nimmt vier Argumente entgegen, von denen das erste der void-Zeiger auf den Ort ist, an dem die gelesenen Bytes gespeichert werden sollen. Die nächsten beiden Argumente geben die Größe und Anzahl der Datenelemente an, die aus der angegebenen Datei gelesen werden sollen. Das vierte Argument der Funktion ist schließlich der FILE-Zeiger, aus dem die Daten gelesen werden sollen. Im folgenden Beispiel öffnen wir die Datei input.txt und schreiben einige beliebige Bytes in die Datei. Dann schließen wir die Datei und öffnen sie erneut zum Lesen.

#include <fcntl.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>

const uint8_t data[] = {0x54, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72,
                        0x79, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
                        0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x77,
                        0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x74,
                        0x6f, 0x20, 0x66, 0x69, 0x6c, 0x65};

const char* filename = "input.txt";

int main(void) {
  FILE* output_file = fopen(filename, "wb+");
  if (!output_file) {
    perror("fopen");
    exit(EXIT_FAILURE);
  }

  fwrite(data, 1, sizeof data, output_file);
  printf("Done Writing!\n");
  fclose(output_file);

  FILE* in_file = fopen(filename, "rb");
  if (!in_file) {
    perror("fopen");
    exit(EXIT_FAILURE);
  }

  struct stat sb;
  if (stat(filename, &sb) == -1) {
    perror("stat");
    exit(EXIT_FAILURE);
  }

  char* file_contents = malloc(sb.st_size);
  fread(file_contents, sb.st_size, 1, in_file);

  printf("read data: %s\n", file_contents);
  fclose(in_file);

  free(file_contents);
  exit(EXIT_SUCCESS);
}

Ausgabe:

Done Writing!
read data: Temporary string to be written to file

Verwenden der Funktion read zum Lesen von Binärdateien in C

Alternativ können wir die Funktion read verwenden, die im Wesentlichen ein Systemaufruf unter der Haube ist. Beachten Sie, dass read auf Dateideskriptoren arbeitet; die Datei sollte also mit dem Systemaufruf open geöffnet werden. Sie nimmt zusätzlich zwei Argumente entgegen, die den void-Zeiger, in dem die gelesenen Daten gespeichert werden, und die Anzahl der aus der Datei zu lesenden Bytes angeben. Beachten Sie, dass wir den gesamten Inhalt der Datei lesen und den Speicher dafür dynamisch mit der Funktion malloc zuweisen. Der Systemaufruf stat wird verwendet, um die Dateigröße zu ermitteln.

#include <fcntl.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>

const uint8_t data[] = {0x54, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72,
                        0x79, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
                        0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x77,
                        0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x74,
                        0x6f, 0x20, 0x66, 0x69, 0x6c, 0x65};

const char* filename = "input.txt";

int main(void) {
  FILE* output_file = fopen(filename, "wb+");
  if (!output_file) {
    perror("fopen");
    exit(EXIT_FAILURE);
  }

  fwrite(data, 1, sizeof data, output_file);
  printf("Done Writing!\n");
  fclose(output_file);

  int fd = open(filename, O_RDONLY);
  if (fd == -1) {
    perror("open\n");
    exit(EXIT_FAILURE);
  }

  struct stat sb;
  if (stat(filename, &sb) == -1) {
    perror("stat");
    exit(EXIT_FAILURE);
  }

  char* file_contents = malloc(sb.st_size);
  read(fd, file_contents, sb.st_size);

  printf("read data: %s\n", file_contents);
  close(fd);

  free(file_contents);

  exit(EXIT_SUCCESS);
}

Ausgabe:

Done Writing!
read data: Temporary string to be written to file
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Verwandter Artikel - C File