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