Leia o arquivo binário em C

Jinku Hu 12 outubro 2023
  1. Use a função fread para ler o arquivo binário em C
  2. Use a função read para ler o arquivo binário em C
Leia o arquivo binário em C

Este artigo demonstrará vários métodos de como ler um arquivo binário em C.

Use a função fread para ler o arquivo binário em C

fread faz parte dos recursos de entrada / saída da biblioteca padrão C e pode ser utilizado para ler dados binários de arquivos regulares. A biblioteca padrão C implementa uma E/S armazenada em buffer pelo usuário junto com uma solução independente de plataforma para lidar com a leitura / gravação de dados de arquivo binário. As funções de E/S padrão operam em ponteiros de arquivo em vez de descritores de arquivo. Streams FILE* são recuperados pela função fopen, que leva o caminho do arquivo como a constante da string e o modo para abri-los. O modo do arquivo especifica se um arquivo deve ser aberto para leitura, gravação ou anexação. Lembre-se, porém, de que cada string de modo pode incluir a letra b para especificar explicitamente o modo de arquivo binário, que pode ser interpretado por alguns sistemas não-UNIX que tratam arquivos de texto e binários de forma diferente.

Depois que fopen retorna o ponteiro do arquivo, podemos chamar a função fread para ler o fluxo binário. fread leva quatro argumentos, o primeiro dos quais é o ponteiro void para o local onde os bytes lidos devem ser armazenados. Os próximos dois argumentos especificam o tamanho e o número dos itens de dados que precisam ser lidos do arquivo fornecido. Finalmente, o quarto argumento para a função é o ponteiro FILE a partir do qual os dados devem ser lidos. No exemplo a seguir, abrimos e gravamos alguns bytes arbitrários no arquivo denominado input.txt. Em seguida, fechamos o arquivo e o abrimos novamente para leitura.

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

Resultado:

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

Use a função read para ler o arquivo binário em C

Alternativamente, podemos usar a função read que é essencialmente uma chamada de sistema por baixo do capô. Observe que read funciona em descritores de arquivo; portanto, o arquivo deve ser aberto com a chamada de sistema open. Leva dois argumentos adicionais denotando o ponteiro void onde os dados lidos serão armazenados e o número de bytes a serem lidos do arquivo. Observe que estamos lendo todo o conteúdo do arquivo e alocando a memória para ele dinamicamente usando a função malloc. A chamada de sistema stat é utilizada para encontrar o tamanho do arquivo.

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

Resultado:

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

Artigo relacionado - C File