Leia o arquivo binário em C
-
Use a função
fread
para ler o arquivo binário em C -
Use a função
read
para ler 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
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