fread  função

Protótipo

size_t fread(void * dados, size_t tamanho, size_t numero_itens, FILE * fluxo);

Descrição

fread tenta ler do fluxo numero_itens elementos, com tamanho bytes cada. Em caso de sucesso, ou seja, todos os elementos tenham sido lidos com sucesso, fread lê (tamanho * numero_itens) bytes do fluxo para o parâmetro dados.

fread funciona como se fgetc fosse chamada tamanho vezes para cada objeto. Note que fread apenas funciona como chamadas sucessivas a fgetc. Na realidade, fread não faz uso da função fgetc.

O ponteiro interno de posição do fluxo é avançado pelo número de bytes lidos.

Parâmetros

dados - Ponteiro para onde os dados serão armazenados. Deve possuir um tamanho, em bytes, de ao menos (tamanho * numero_itens)

tamanho - Tamanho de um único elemento

numero_itens - Número de elementos

fluxo - Fluxo a ser lido

Valor de retorno

Retorna o número de objetos lidos com sucesso. Pode ser menor do que numero_itens caso um erro aconteça ou o fim de arquivo (EOF) seja encontrado. Nesse caso, os respectivos indicadores são setados e podem ser acessados com ferror e feof.

Caso tamanho ou numero_itens seja zero, fread retorna zero e não faz nada.

Exemplo

Lendo o arquivo inteiro em uma só chamada. Note que, se fread fosse chamada como fread(buffer, tamanho, 1, arquivo) ao invés de fread(buffer, 1, tamanho, arquivo), leituras parciais não seriam possíveis. Com tamanho elementos de 1 byte só, leituras parciais, em caso de erro, são possíveis (5 elementos lidos = 5 bytes). Com 1 elemento de tamanho bytes, leituras parciais não são possíveis. Em caso de erro, nada seria lido com sucesso.

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE* arquivo = fopen("arquivo_binario.bin", "rb");
    if(arquivo == NULL) {
        fprintf(stderr, "Erro ao tentar abrir arquivo_binario.bin.\n");
        return 1;
    }

    /* Lê o tamanho total do arquivo */
    fseek(arquivo, 0, SEEK_END);
    long tamanho = ftell(arquivo);
    rewind(arquivo);

    /* Armazena a posição inicial */
    char* buffer = (char *) malloc(tamanho * sizeof(char));
    if(buffer == NULL) {
        fprintf(stderr, "Erro ao tentar alocar o buffer de memória.\n");
        return 2;
    }

    /* Lê o arquivo inteiro em uma só chamada */
    size_t elementos_lidos = fread(buffer, 1, tamanho, arquivo);
    if(elementos_lidos != tamanho) {
        fprintf(stderr, "Erro ao tentar ler o arquivo inteiro.\n");
        return 3;
    }
    
    /* Desaloca os recursos */
    free(buffer);
    fclose(arquivo);

    return 0;
}
Veja também

fwrite função

fgetc função