aula 218

Como escrever em arquivo binário com a função fwrite?

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

Deixe um comentário

1 × um =

Wagner Gaspar

Capixaba de São Gabriel da Palha, Espírito Santo. Bacharel em Ciência da Computação pela Universidade Federal do Amazonas e mestre em informática pela Universidade Federal do Espírito Santo.