Lesen einer Binärdatei in C
-
Verwendung von die Funktion
fread
zum Lesen einer Binärdatei in C -
Verwenden der Funktion
read
zum Lesen von Binärdateien 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
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