Leggi il file binario in C

Jinku Hu 12 ottobre 2023
  1. Usa la funzione fread per leggere il file binario in C
  2. Usa la funzione read per leggere il file binario in C
Leggi 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
Autore: 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

Articolo correlato - C File