Leer archivo binario en C

Jinku Hu 12 octubre 2023
  1. Utilice la función fread para leer un archivo binario en C
  2. Utilice la función read para leer un archivo binario en C
Leer archivo binario en C

Este artículo demostrará varios métodos de cómo leer un archivo binario en C.

Utilice la función fread para leer un archivo binario en C

fread es parte de las funciones de entrada/salida de la biblioteca estándar de C, y se puede utilizar para leer datos binarios de archivos normales. La biblioteca estándar de C implementa una E/S con búfer de usuario junto con una solución independiente de la plataforma para manejar la lectura/escritura de datos de archivos binarios. Las funciones de E/S estándar operan en punteros de archivo en lugar de descriptores de archivo. Los flujos FILE * son recuperados por la función fopen, que toma la ruta del archivo como la constante de cadena y el modo para abrirlos. El modo del archivo especifica si se abre un archivo para leerlo, escribirlo o agregarlo. Sin embargo, tenga en cuenta que cada cadena de modo puede incluir la letra b para especificar explícitamente el modo de archivo binario, que puede ser interpretado por algunos sistemas que no son UNIX que tratan los archivos de texto y binarios de manera diferente.

Después de que fopen devuelve el puntero del archivo, podemos llamar a la función fread para leer el flujo binario. fread toma cuatro argumentos, el primero de los cuales es el puntero void a la ubicación donde se deben almacenar los bytes leídos. Los siguientes dos argumentos especifican el tamaño y el número de elementos de datos que deben leerse del archivo dado. Finalmente, el cuarto argumento de la función es el puntero FILE desde el que se deben leer los datos. En el siguiente ejemplo, abrimos y escribimos algunos bytes arbitrarios en el archivo llamado input.txt. Luego, cerramos el archivo y lo abrimos nuevamente para su lectura.

#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);
}

Producción :

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

Utilice la función read para leer un archivo binario en C

Alternativamente, podemos usar la función read que es esencialmente una llamada al sistema debajo del capó. Observe que read funciona con descriptores de archivos; por lo tanto, el archivo debe abrirse con la llamada al sistema open. Se necesitan dos argumentos adicionales que denotan el puntero void donde se almacenarán los datos leídos y el número de bytes que se leerán del archivo. Tenga en cuenta que estamos leyendo el contenido completo del archivo y asignando la memoria para él dinámicamente usando la función malloc. La llamada al sistema stat se utiliza para encontrar el tamaño del archivo.

#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);
}

Producción :

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

Artículo relacionado - C File