Você está visualizando atualmente Arquivo binário com a linguagem de programação C

Arquivo binário com a linguagem de programação C

Na aula anterior nós aprendemos como trabalhar com arquivo texto com a linguagem de programação C. Caso você tenha perdido esta aula acesse aqui.

Hoje vamos aprender a fazer as mesmas operações de leitura e escrita, porém, em um arquivo binário.

Um arquivo texto pode ser aberto com qualquer editor de texto e seu conteúdo é compreensível para nós humanos. Um arquivo binário até pode ser aberto com um editor de texto, contudo você receberá uma mensagem dizendo que o arquivo não pode ser aberto corretamente e verá um punhado de caracteres estranhos. Isso ocorre porque apenas o computador é capas de entender um arquivo binário.

Como já temos o código da aula anterior, vamos apenas acrescentar mais duas funções, uma para escrever no arquivo binário e uma para ler do arquivo binário.

No procedimento salvarEmArquivo2() vamos abrir ou criar um novo arquivo chamado lista2.txt. Esse processo será feito com os caracteres “w”, de write e “b” de binary.

void salvarEmArquivo2(){
    FILE *arq = fopen("lista2.txt", "wb"); // abre um arquivo binário para escrita
    if(arq){ // verifica se o arquivo foi aberto / criado corretamente
        fprintf(arq, "%d\n", quant); // escreve a quantidade de pessoas
        fwrite(lista, sizeof(Pessoa), quant, arq); // escreve todas as pessoas de uma vez
        fclose(arq); // fecha o arquivo
    }
    else
        printf("ERRO: nao foi possivel abrir o arquivo.\n\n");
}

A principal diferença aqui é que, como é um arquivo binário, podemos escrever tudo de uma vez com a função fwrite() com os seguintes parâmetros:
lista -> onde estão os dados a serem escritos;
sizeof(Pessoa) -> tamanho de uma Pessoa;
quant -> quantidade de pessoas a serem escritas;
arq -> arquivo que receberá os dados.

Para a leitura temos um processo muito semelhante no procedimento lerDoArquivo2(). O arquivo é aberto com os caracteres “r” de read e “b” de binary.

A função fread() faz a leitura de blocos de bytes. Assim, conseguimos ler todas as pessoas sem precisar de uma repetição.
lista -> indica a estrutura que receberá os dados lidos, neste caso nosso vetor;
sizeof(Pessoa) -> tamanho de uma Pessoa;
quant -> quantidade de pessoas a serem lidas;
arq -> de onde será lido.

void lerDoArquivo2(){
    FILE *arq = fopen("lista2.txt", "rb"); // abre um arquivo binário para leitura
    if(arq){ // verifica se o arquivo foi aberto corretamente
        fscanf(arq, "%d\n", &quant); // l}e a quantidade de pessoas
        fread(lista, sizeof(Pessoa), quant, arq); // lê todas as pessoas
        fclose(arq); // fecha o arquivo
    }
    else
        printf("ERRO: nao foi possivel abrir o arquivo.\n\n");
}

Código completo

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

typedef struct{
    char nome[50];
    int idade;
    char sexo;
}Pessoa;

int tam = 10;
Pessoa lista[10];
int quant = 0;

int cadstrarPessoa(){
    if(quant < tam){
        Pessoa p;
        scanf("%*c");
        printf("Nome: ");
        fgets(p.nome, 50, stdin);
        printf("Digite idade e sexo m ou f: ");
        scanf("%d %c", &p.idade, &p.sexo);
        lista[quant] = p;
        quant++;
        return 1;
    }
    else{
        printf("ERRO: vetor cheio.\n\n");
        return 0;
    }
}

void imprimirVetor(){
    int i;
    for(i = 0; i < quant; i++){
        printf("Nome: %s", lista[i].nome);
        printf("Idade: %d\tSexo: %c\n\n", lista[i].idade, lista[i].sexo);
    }
}

void salvarEmArquivo(){
    FILE *arq = fopen("lista.txt", "w");
    int i;
    if(arq){
        fprintf(arq, "%d\n", quant);
        for(i = 0; i < quant; i++){
            fprintf(arq, "%s", lista[i].nome);
            fprintf(arq, "%d\n", lista[i].idade);
            fprintf(arq, "%c\n", lista[i].sexo);
        }
        fclose(arq);
    }
    else
        printf("ERRO: nao foi possivel abrir o arquivo.\n\n");
}

void salvarEmArquivo2(){
    FILE *arq = fopen("lista2.txt", "wb");
    if(arq){
        fprintf(arq, "%d\n", quant);
        fwrite(lista, sizeof(Pessoa), quant, arq);
        fclose(arq);
    }
    else
        printf("ERRO: nao foi possivel abrir o arquivo.\n\n");
}

void lerDoArquivo(){
    FILE *arq = fopen("lista.txt", "r");
    int i;
    if(arq){
        fscanf(arq, "%d\n", &quant);
        for(i = 0; i < quant; i++){
            Pessoa p;
            fgets(p.nome, 50, arq);
            fscanf(arq, "%d\n", &p.idade);
            fscanf(arq, "%c\n", &p.sexo);
            lista[i] = p;
        }
        fclose(arq);
    }
    else
        printf("ERRO: nao foi possivel abrir o arquivo.\n\n");
}

void lerDoArquivo2(){
    FILE *arq = fopen("lista2.txt", "rb");
    if(arq){
        fscanf(arq, "%d\n", &quant);
        fread(lista, sizeof(Pessoa), quant, arq);
        fclose(arq);
    }
    else
        printf("ERRO: nao foi possivel abrir o arquivo.\n\n");
}

int main() {
    int op;

    do{
        printf("\n1 - Cadastrar\n2 - Imprimir\n3 - Salvar em arquivo texto\n4 - Ler do arquivo texto");
        printf("\n5 - Salvar em arquivo binario\n6 - Ler do arquivo binario\n0 - Sair\n");
        scanf("%d", &op);

        switch(op){
        case 0:
            printf("Tchau...\n\n");
            break;
        case 1:
            cadstrarPessoa();
            break;
        case 2:
            imprimirVetor();
            break;
        case 3:
            salvarEmArquivo();
            break;
        case 4:
            lerDoArquivo();
            break;
        case 5:
            salvarEmArquivo2();
            break;
        case 6:
            lerDoArquivo2();
            break;
        default:
            printf("Opcao invalida.\n\n");
        }

    }while(op != 0);

    return 0;
}

Deixe um comentário

11 + catorze =

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.