Leggi il file binario in C
-
Usa la funzione
fread
per leggere il file binario in C -
Usa la funzione
read
per leggere il file binario in C
Questo articolo illustrerà più metodi su come leggere un file binario in C.
Usa la funzione fread
per leggere il file binario in C
fread
fa parte delle funzionalità di input / output della libreria standard C e può essere utilizzato per leggere dati binari da file normali. La libreria standard C implementa un I/O bufferizzato dall’utente insieme a una soluzione indipendente dalla piattaforma per gestire la lettura / scrittura di dati di file binari. Le funzioni I/O standard operano sui puntatori di file invece che sui descrittori di file. I flussi FILE*
vengono recuperati dalla funzione fopen
, che prende il percorso del file come costante di stringa e la modalità per aprirli. La modalità del file specifica se aprire un file per la lettura, la scrittura o l’aggiunta. Tuttavia, ogni stringa di modalità può includere la lettera b
per specificare esplicitamente la modalità file binario, che può essere interpretata da alcuni sistemi non UNIX che trattano i file di testo e binari in modo diverso.
Dopo che fopen
restituisce il puntatore del file, possiamo chiamare la funzione fread
per leggere il flusso binario. fread
richiede quattro argomenti, il primo dei quali è il puntatore void
alla posizione in cui devono essere memorizzati i byte letti. I due argomenti successivi specificano la dimensione e il numero degli elementi di dati che devono essere letti dal file specificato. Infine, il quarto argomento della funzione è il puntatore FILE
da cui devono essere letti i dati. Nell’esempio seguente, apriamo e scriviamo alcuni byte arbitrari nel file denominato input.txt
. Quindi, chiudiamo il file e lo riapriamo per la lettura.
#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);
}
Produzione:
Done Writing!
read data: Temporary string to be written to file
Usa la funzione read
per leggere il file binario in C
In alternativa, possiamo usare la funzione read
che è essenzialmente una chiamata di sistema sotto il cofano. Notare che read
funziona sui descrittori di file; quindi il file dovrebbe essere aperto con la chiamata di sistema open
. Ci vogliono altri due argomenti che denotano il puntatore void
dove verranno memorizzati i dati letti e il numero di byte da leggere dal file. Notare che stiamo leggendo l’intero contenuto del file e allocandone la memoria dinamicamente utilizzando la funzione malloc
. La chiamata di sistema stat
viene utilizzata per trovare la dimensione del file.
#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);
}
Produzione:
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