Dando continuidade ao estudo dos arquivos binários aqui em nosso Curso de Programação C, vamos aprender hoje como inserir suporte a arquivos binários em nossa agenda de aniversário.
Precisaremos de um novo arquivo. Para a agenda criaremos o arquivo agenda.dat. Eu escolhi dar ao meu arquivo binário a extensão .dat, fique à vontade para escolher outra extensão.
// nome do arquivo binário para nossa agenda de contatos
char arquivo2[] = {"agenda.dat"};
Agora, precisamos criar mais três procedimentos, um para salvar nossa agenda no arquivo binário, um para ler, e por fim, um para alterar um contato em nossa agenda (que será feito na aula próxima aula).
Vamos começar com um procedimento para salvar. Como nosso arquivo agora é um arquivo binário, não precisamos nos preocupar com cada informação de um contato, basta percorrermos nosso vetor e escrever cada contato, um bloco de bytes, em nosso arquivo, como feito a seguir:
// procedimento para salvar a agenda em um arquivo binário
void salvarB(char arq[], Contato **c, int quant){
FILE *file = fopen(arq, "wb");
int i;
if(file){
for(i = 0; i < quant; i++)
fwrite(c[i], sizeof(Contato), 1, file);
fclose(file);
}
else
printf("\nErro ao abrir arquivo!\n");
}
Vamos agora fazer a leitura do arquivo. Como desejamos ler todos os contatos salvos no arquivo, vamos realizar a leitura enquanto a função fread retornar um valor diferente de zero (a função fread retorna a quantidade de itens lidos). Para cada contato lido, ele será salvo no vetor e a variável contadora será incrementada em uma unidade. Ao final, retornamos a variável contadora, pois ela indica quantos contatos foram lidos, ou seja, quantos elementos há no vetor.
// função para ler um arquivo binário de contatos
int lerB(char arq[], Contato **c){
int quant = 0;
Contato *novo = malloc(sizeof(Contato));
FILE *file = fopen(arq, "rb");
if(file){
while(fread(novo, sizeof(Contato), 1, file)){
c[quant] = novo;
quant++;
novo = malloc(sizeof(Contato));
}
fclose(file);
}
else
printf("\nErro ao abrir arquivo!\n");
return quant;
}
Na próxima aula vamos finalizar nossa agenda, desenvolvendo também um procedimento para alterar um contato salvo no arquivo binário.
Código completo em C para a agenda de aniversários
/*
AGENDA DE ANIVERSÁRIOS
Código escrito por Wagner Gaspar
Junho de 2021
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct{
char nome[50];
int dia, mes, ano;
}Contato;
void imprimir(Contato **c, int quant){
int i;
printf("\n\t\tLista de Contatos:\n");
printf("\t--------------------------------\n");
for(i = 0; i < quant; i++){
printf("\t%d = %2d/%2d/%4d\t%s\n", i+1, c[i]->dia, c[i]->mes, c[i]->ano, c[i]->nome);
}
printf("\t--------------------------------\n");
}
int cadastrar_contato(Contato **c, int quant, int tam){
if(quant < tam){
Contato *novo = malloc(sizeof(Contato));
printf("\nDigite o nome do contato: ");
scanf("%49[^\n]", novo->nome);
printf("\nDigite a data de aniversario dd mm aaaa: ");
scanf("%d%d%d", &novo->dia, &novo->mes, &novo->ano);
getchar();
c[quant] = novo;
return 1;
}
else{
printf("\n\tImpossivel novo cadastro. Vetor cheio!\n");
return 0;
}
}
void alterar_contato(Contato **c, int quant){
int id;
imprimir(c, quant);
printf("\n\tDigite o codigo do contato que deseja alterar: \n");
scanf("%d", &id);
getchar();
id--;
if(id >= 0 && id < quant){
Contato *novo = malloc(sizeof(Contato));
printf("\nDigite o nome do contato: ");
scanf("%49[^\n]", novo->nome);
printf("\nDigite a data de aniversario dd mm aaaa: ");
scanf("%d%d%d", &novo->dia, &novo->mes, &novo->ano);
getchar();
c[id] = novo;
}
else
printf("\n\tCodigo invalido!\n");
}
void salvar(Contato **c, int quant, char arq[]){
FILE *file = fopen(arq, "w");
int i;
if(file){
fprintf(file, "%d\n", quant);
for(i = 0; i < quant; i++){
fputs(c[i]->nome, file);
fputc('\n', file);
fprintf(file, "%d %d %d\n", c[i]->dia, c[i]->mes, c[i]->ano);
}
fclose(file);
}
else
printf("\n\tNAO FOI POSSIVEL ABRIR/CRIAR O ARQUIVO!\n");
}
int ler_arquivo(Contato **c, char arq[]){
FILE *file = fopen(arq, "r");
int quant = 0, i;
Contato *novo = malloc(sizeof(Contato));
if(file){
fscanf(file, "%d\n", &quant);
for(i = 0; i < quant; i++){
//fgets(novo->nome, 50, file);
fscanf(file, "%50[^\n]", novo->nome);
fscanf(file, "%d %d %d\n", &novo->dia, &novo->mes, &novo->ano);
c[i] = novo;
novo = malloc(sizeof(Contato));
}
fclose(file);
}
else
printf("\n\tNAO FOI POSSIVEL ABRIR/CRIAR O ARQUIVO!\n");
return quant;
}
void salvarB(char arq[], Contato **c, int quant){
FILE *file = fopen(arq, "wb");
int i;
if(file){
for(i = 0; i < quant; i++)
fwrite(c[i], sizeof(Contato), 1, file);
fclose(file);
}
else
printf("\nErro ao abrir arquivo!\n");
}
int lerB(char arq[], Contato **c){
int quant = 0;
Contato *novo = malloc(sizeof(Contato));
FILE *file = fopen(arq, "rb");
if(file){
while(fread(novo, sizeof(Contato), 1, file)){
c[quant] = novo;
quant++;
novo = malloc(sizeof(Contato));
}
fclose(file);
}
else
printf("\nErro ao abrir arquivo!\n");
return quant;
}
int main(){
Contato *agenda[50];
char arquivo[] = {"agenda.txt"};
char arquivo2[] = {"agenda.dat"};
int opcao, tam = 50, quant = 0;
do{
printf("\n\t0 - Sair\n\t1 - Cadastrar\n\t2 - Alterar\n\t3 - Imprimir\n");
printf("\t4 - Salvar\n\t5 - Ler arquivo\n\t6 - SalvarB\n\t7 - LerB\n");
scanf("%d", &opcao);
getchar();
switch(opcao){
case 1:
quant += cadastrar_contato(agenda, quant, tam);
break;
case 2:
alterar_contato(agenda, quant);
break;
case 3:
imprimir(agenda, quant);
break;
case 4:
salvar(agenda, quant, arquivo);
break;
case 5:
quant = ler_arquivo(agenda, arquivo);
break;
case 6:
salvarB(arquivo2, agenda, quant);
break;
case 7:
quant = lerB(arquivo2, agenda);
break;
default:
if(opcao != 0)
printf("\n\tOpcao invalida!!!\n");
}
}while(opcao != 0);
return 0;
}
