Skip to content

Instantly share code, notes, and snippets.

@gregori
Last active November 9, 2020 13:42
Show Gist options
  • Save gregori/4a97111be274e0d6b6a4f920cba88119 to your computer and use it in GitHub Desktop.
Save gregori/4a97111be274e0d6b6a4f920cba88119 to your computer and use it in GitHub Desktop.
Exemplo de agenda com gravação e leitura de arquivo binário, em C
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define clear() puts("\x1B[2J")
#define MAX_AGENDA 50
typedef struct {
char nome[50];
int idade;
} registro;
void imprimeMenu() {
puts("Agenda eletronica");
puts("\n");
puts("1 - Novo Contato");
puts("2 - Lista Contatos");
puts("S - Sair");
puts("\n");
printf("Escolha uma opção: ");
}
void criaContato(registro r[], int *tamanho) {
int indice = *tamanho;
printf("Entre o nome do contato: ");
scanf("%s", r[indice].nome);
printf("Entre a idade do contato: ");
scanf("%d", &r[indice].idade);
*tamanho = *tamanho + 1;
}
void listaContatos(registro r[], int *tamanho) {
clear();
int tam = *tamanho;
puts("Lista de Contatos\n");
puts("Nome\tIdade\n");
for (int i = 0; i < tam; i++) {
printf("%s\t%d\n", r[i].nome, r[i].idade);
}
}
void processaOpcao(int opcao, registro r[], int *tamanho) {
switch(opcao) {
case '1':
criaContato(r, tamanho);
break;
case '2':
listaContatos(r, tamanho);
break;
case 's':
puts("Encerrando...\n");
break;
default:
puts("Opção inválida!\n");
break;
}
}
int main() {
FILE *arquivo;
char *nome_arquivo = "agenda.bin";
char op;
registro agenda[MAX_AGENDA];
int tamanho = 0;
// lê o arquivo e carrega seu conteúdo para o vetor "agenda", se existir
arquivo = fopen(nome_arquivo, "rb");
if (arquivo != NULL) {
fread(&tamanho, sizeof(int), 1, arquivo);
fread(agenda, sizeof(registro), MAX_AGENDA, arquivo);
fclose(arquivo);
} else {
puts("Sem arquivo!");
}
do {
clear(); // limpa a tela - multiplataforma
imprimeMenu();
op = tolower(getchar());
processaOpcao(op, agenda, &tamanho);
fflush(stdin); // limpa o buffer do teclado (para remover lixos)
getchar();
getchar();
} while (op != 's');
// grava o arquivo, com o conteúdo do vetor, ao sair
arquivo = fopen(nome_arquivo, "wb");
fwrite(&tamanho, sizeof(int), 1, arquivo);
fwrite(agenda, sizeof(registro), MAX_AGENDA, arquivo);
fclose(arquivo);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment