Dando continuidade ao estudo e manipulação de arquivos com a linguagem C, vamos aprender nesta aula como criar e escrever em um arquivo binário com a função fwrite.
Com a linguagem C, além de arquivos texto, também podemos manipular arquivos binários.
Um Arquivo texto pode ser aberto por qualquer editor de texto e seu conteúdo é compreensível para nós humanos. Em contrapartida, um arquivo binário apenas é lido corretamente pelo programa que o criou e nós humanos não conseguimos ler seu conteúdo, mesmo se abrirmos o arquivo em um aditor de texto. Então, não se assuste ao abrir um arquivo binário com um editor de texto e ver um monte de caracteres estranhos, ou mesmo uma mensagem de erro dizendo que o arquivo não pode ser lido. Isso é normal.
Enquanto em um arquivo texto são escritas palavras, caracteres, em um arquivo binário são escritos blocos de bytes. Isso torna o processo de escrita e leitura muito mais simples, tendo apenas duas funções para estas ações, uma para escrever e outra para ler.
Modos de abertura de um arquivo binário em C
Os modos de abertura de um arquivo binário são exatamente os mesmos que já aprendemos ao manipular arquivos texto. A diferença é que agora precisamos acrescentar um b ( de binário ) em cada um dos modos, como apresentado a seguir:
Modos de abertura de arquivos binários em C: wb -> Escrita rb -> leitura ab -> anexar rb+ -> leitura e escrita wb+ -> leitura e escrita (apaga o conteúdo caso o arquivo exista) ab+ -> leitura e escrita (adiciona ao final do arquivo)
A função fwrite para escrever em arquivos binários em C
Nesta aula vamos conhecer a função fwrite para escrever em um arquivo binário. Esta função recebe quatro parâmetros nesta ordem:
– o endereço da variável cujo conteúdo será escrito no arquivo;
– o tamanho do dado que será escrito;
– a quantidade de dados que serão escritos;
– o ponteiro para o arquivo onde os dados serão escritos.
Alguns exemplos práticos de uso da função fwrite:
// exemplos de uso da função fwrite // escreve 1 número inteiro no arquivo binário fwrite(&num, sizeof(int), 1, file); // escreve 5 números inteiros no arquivo binário fwrite(vet, sizeof(int), 5, file); // escreve um caracter no arquivo binário fwrite(&letra, sizeof(char), 1, file); // escreve um Contato no arquivo binário fwrite(&c, sizeof(Contato), 1, file);
Vamos a um exemplo prático. Imagine o tipo Contato a seguir:
typedef struct{ char nome[50]; int dia, mes, ano; }Contato;
Observe que o tipo Contato possui um nome ( vetor de caracteres ) e três inteiros para a data de nascimento. Em um arquivo texto precisaríamos escrever cada um esses dados individualmente. Em um arquivo binário podemos simplesmente escrever o bloco de bytes do Contato em memória, assim:
void escrever(char arq[]){ Contato c; FILE *file = fopen(arq, "ab"); if(file){ printf("Digite o nome e a data de nascimento dd mm aaaa: "); scanf("%49[^\n]%d%d%d", c.nome, &c.dia, &c.mes, &c.ano); fwrite(&c, sizeof(Contato), 1, file); fclose(file); } else printf("\nErro ao abrir arquivo!\n"); }
O arquivo foi aberto no modo ab, isso significa que cada novo Contato será adicionado ao final do arquivo não alterando os dados salvos anteriormente caso o arquivo já existisse.
Código de exemplo completo em C para escrever em um arquivo binário com a função fwrite
/* Aula 218: Escrevendo em arquivo binário com a função fwrite() Código escrito por Wagner Gaspar Junho de 2021 Modos de abertura de arquivos: wb -> Escrita rb -> leitura ab -> anexar rb+ -> leitura e escrita wb+ -> leitura e escrita (apaga o conteúdo caso o arquivo exista) ab+ -> leitura e escrita (adiciona ao final do arquivo) */ typedef struct{ char nome[50]; int dia, mes, ano; }Contato; void escrever(char arq[]){ Contato c; FILE *file = fopen(arq, "ab"); if(file){ printf("Digite o nome e a data de nascimento dd mm aaaa: "); scanf("%49[^\n]%d%d%d", c.nome, &c.dia, &c.mes, &c.ano); fwrite(&c, sizeof(Contato), 1, file); fclose(file); } else printf("\nErro ao abrir arquivo!\n"); } int main(){ char arquivo[] = {"agenda.dat"}; escrever(arquivo); return 0; }