aula 219

Como ler um arquivo binário com a função fread?

Dando continuidade ao estudo e manipulação de arquivos binários com a linguagem C, vamos aprender nesta aula como ler um arquivo binário com a função fread().

Enquanto em um arquivo texto precisamos estar atentos ao tipo do dado que será lido, em um arquivo binário isso não importa uma vez que iremos ler uma sequência de bytes.

Assim como para a escrita, para a leitura de um arquivo binário temos também apenas uma função, fread. Assim como sua irmã, ela recebe quatro parâmetros: o endereço da variável que vai receber o dado lido; o tamanho do que será lido; a quantidade que será lida e o ponteiro para o arquivo de onde será lido.

Para ler todo o conteúdo do arquivo há algumas formas possíveis. No trecho de código abaixo são apresentados dois testes possíveis. No primeiro verificamos se chegamos ao final do arquivo, dessa forma a leitura será feita enquanto não o fim do arquivo não for atingido.

Contudo, caso exista uma quebra de linha no final do arquivo nós já vimos com arquivo texto que isso pode causar a duplicação da última informação lida. Para evitar isso podemos testar o retorna função fread. Ela sempre retorna a quantidade de itens lidos.

void ler(char arq[]){
    Contato c;
    FILE *file = fopen(arq, "rb");

    if(file){
        while(!feof(file)){
            if(fread(&c, sizeof(Contato), 1, file))
                printf("\nNome: %s\nData: %d/%d/%d\n", c.nome, c.dia, c.mes, c.ano);
        }
        fclose(file);
    }
    else
        printf("\nErro ao abrir arquivo!\n");
}

Código de exemplo completo em C para ler e escrever em arquivo binário

/*
        Aula 218 e 219: Lendo em arquivo binário com a função fread()

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

void ler(char arq[]){
    Contato c;
    FILE *file = fopen(arq, "rb");

    if(file){
        while(!feof(file)){
            if(fread(&c, sizeof(Contato), 1, file))
                printf("\nNome: %s\nData: %d/%d/%d\n", c.nome, c.dia, c.mes, c.ano);
        }
        fclose(file);
    }
    else
        printf("\nErro ao abrir arquivo!\n");
}

int main(){
    char arquivo[] = {"agenda.dat"};

    escrever(arquivo);
    ler(arquivo);

    return 0;
}

Deixe um comentário

dezessete − 14 =

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.