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