Dando continuidade à construção da nossa agenda de aniversários aqui em nosso Curso de Programação C, nesta aula vamos aprender como salvar nossa agenda de aniversários em um arquivo texto.
Na aula anterior nós criamos nosso tipo Contato, um vetor de Contatos e fizemos as funções e procedimentos para ler um Contato, alterar um Contato e imprimir os Contatos.
Vamos agora elaborar um procedimento para salvar em um arquivo texto todos os Contados inseridos no vetor. Este procedimento recebe o endereço inicial do vetor, a quantidade de Contatos no vetor e o nome do arquivo a ser criado. Como desejamos salvar os dados no arquivo, então abriremos o mesmo no modo escrita ( w ).
Com o arquivo aberto podemos iniciar a escrita dos Contatos, mas antes disse é bom que você pense um pouco em como irá escrever estes dados no arquivo, uma vez que é a escrita que vai determinar como serão lidos estes dados. Perceba que a forma como escrevemos pode facilitar ou dificultar a leitura.
Observe que para escrever os dados no arquivo nós sabemos quantos são. Contudo, quando formos ler do arquivo, nós já vimos nas aulas anteriores que a quebra de linha após cada linha pode atrapalhar um pouco, certo? Se nós soubéssemos a quantidade de Contatos essa quebra de linha seria irrelevante, concorda? Será que é possível sabermos quantos Contatos há no arquivo antes da sua leitura?
Sim. Isso faz parte da estratégia de escrita.
A primeira informação que vamos escrever no arquivo é exatamente a quantidade de Contatos que há no vetor. Assim, quando formos fazer a leitura, já sabemos que na primeira linha existe um número e este número representa a quantidade de Contatos em nosso arquivo.
Na sequência vamos escrever os Contatos. Para facilitar a leitura vamos usar duas linhas para cada Contato, o nome em uma linha (que será lido como texto na próxima aula) e a data em outra linha, com três números separados por um espaço (que serão lidos como números mesmo na próxima aula), assim:
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"); }
Na próxima aula vamos finalizar nossa agenda lendo todos os Contatos salvos no arquivo e preenchendo o vetor na função main.
Código completo em C para a agenda de aniversário
// AGENDA DE ANIVERSÁRIOS 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("%50[^\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("%50[^\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 main(){ Contato *agenda[50]; char arquivo[] = {"agenda.txt"}; int opcao, tam = 50, quant = 0; do{ printf("\n\t0 - Sair\n\t1 - Cadastrar\n\t2 - Alterar\n\t3 - Imprimir\n\t4 - Salvar\n\t5 - Ler arquivo\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: break; default: if(opcao != 0) printf("\n\tOpcao invalida!!!\n"); } }while(opcao != 0); return 0; }