Arquivos binários

✍️ Escrita

Para efetuar a operação de escrita em um arquivo binário, fazemos uso da função fwrite, que possui a seguinte assinatura:

size_t fwrite(const void *conteudo, size_t tamanhoUnitario, size_t qtde, FILE *arquivo);
  • const void *conteudo: Ponteiro para o bloco de memória com os dados a serem escritos.
  • size_t tamanhoUnitario: Tamanho, em bytes, de cada elemento a ser escrito.
  • size_t qtde: Número de elementos, cada um com tamanho de size bytes, a serem escritos.
  • FILE *arquivo: Ponteiro para o arquivo onde os dados serão escritos.

Como retorno, a função fwrite apresenta o número total de itens que foram efetivamente gravados. Se esse valor for inferior a qtde, parte dos dados não foram persistidos.

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

int main() {
    FILE *arquivo = fopen("arquivo.txt", "wb");
    int vetor[] = {1, 2, 3, 4, 5};
    size_t qtde = sizeof(vetor) / sizeof(vetor[0]);

    if(!arquivo) {
        printf("Erro ao abrir arquivo para escrita.\n");
        return 1;
    }

    // Escrevendo array de inteiros no arquivo
    fwrite(vetor, sizeof(int), qtde, arquivo);

    fclose(arquivo);
    return 0;
}

👀 Leitura

Para efetuar a operação de leitura, usamos a função fwrite, que tem os mesmos parâmetros da função fwrite:

size_t fread(const void *conteudo, size_t tamanhoUnitario, size_t qtde, FILE *arquivo);
  • void *conteudo: Ponteiro para um bloco de memória (principal, do programa) onde os dados lidos serão armazenados.
  • size_t tamanhoUnitario: Tamanho, em bytes, de cada elemento a ser lido.
  • size_t qtde: Número de elementos, cada um com tamanho de size bytes, a serem lidos.
  • FILE *arquivo: Ponteiro para o arquivo de onde os dados serão lidos.

De forma similar à escrita, a função fread retorna o número total de elementos lidos com sucesso. O número retornado pode ser menor do que desejado em caso de erro ou se o fim do arquivo for alcançado antes de ler qtde elementos.

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

int main() {
    FILE *arquivo = fopen("arquivo.txt", "rb");
    int vetor[5];
    size_t qtde = sizeof(vetor) / sizeof(vetor[0]);

    if (!arquivo) {
        printf("Erro ao abrir arquivo para leitura.\n");
        return 1;
    }

    // Lendo dados do arquivo para o buffer
    fread(vetor, sizeof(int), qtde, arquivo);

    // Imprimindo os dados lidos
    for (int i = 0; i < qtde; i++) {
        printf("%d\n", vetor[i]);
    }

    fclose(arquivo);
    return 0;
}