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