parte 4 – ficheiros (binários)
Existem dois tipos de ficheiros: binários e de texto
se for feito uso de um ficheiro binário é recomendável que se guarde o numero de estruturas logo no inicio do ficheiro e de seguida as estruturas
versão light onde indico qual o numero de estruturas que existem e que vão ser guardadas no ficheiro
#include <stdio.h> #include <stdlib.h> #include <string.h> #define TAM 5 typedef struct dados{ char numeroConta[15]; char nome[50]; int montante; } cliente; int menu(){ int i; puts("1 - adiciona cliente"); puts("2 - elimina cliente"); puts("3 - lista clientes"); puts("4 - mostra mais rico"); puts("5 - terminar"); puts("Escolha uma opcao: "); do{ scanf(" %d", &i); }while(i <0 || i >5); return i; } cliente escreve_cliente(){ cliente t; printf("Qual o numero da conta?"); scanf(" %14s", t.numeroConta); printf("Qual o nome?"); scanf(" %99[^\n]", t.nome); printf("Qual o montante?"); scanf("%d", &(t.montante)); return t; } void adiciona_cliente(cliente tabC[], int *totalC){ if(*totalC>=TAM){ printf("tabela de cliente cheia"); }else{ tabC[*totalC] = escreve_cliente(); (*totalC)++; } } void mostra_todos(cliente tab[], int totalC){ if(totalC==0){ printf("nao existem clientes\n"); }else{ for(int i=0; i< totalC; i++){ printf("%s \t %s \t %d \n", tab[i].numeroConta, tab[i].nome, tab[i].montante); } } } void procura_mais_rico(cliente tab[], int totalC){ cliente maiorT; int aux=0, i=0; if(totalC==0){ printf("nao existem clientes\n"); }else{ maiorT.montante = tab[i].montante; for(; i< totalC; i++){ if(tab[i].montante > maiorT.montante ){ aux = i; } } printf("\no maior vem %d:\n" , aux); printf("%s \t %s \t %d \n", tab[aux].numeroConta, tab[aux].nome, tab[aux].montante); } } void elimina_cliente(cliente tab[], int *totalC){ char st[15]; int i; printf("Qual o numero da conta a eliminar? (%d)", *totalC); scanf(" %14s", st); if(totalC<0){ printf("nao existem clientes. nao se pode eliminar nada\n"); }else{ for(i=0; i < *totalC && strcmp(st, tab[i].numeroConta)!=0; i++) //serve para posicionar o i quando encontrei ; if(i==*totalC){ printf("cliente nao existe\n"); }else{ tab[i]=tab[*totalC-1]; //serve para arrastar o ultimo para a posição atual (*totalC)--; } } } void guarda_dados_binario(cliente *b, int totalC){ FILE *f; f = fopen("bancoBinario.bin", "wb"); if(f==NULL){ printf("\n erro no acesso ao ficheiro \n"); return; }else{ fwrite(&totalC, sizeof(int), 1, f); fwrite(b, sizeof(cliente), totalC, f); fclose(f); } } int ler_dados_binario(cliente *b){ FILE *f; int total; f = fopen("bancoBinario.bin", "rb"); if(f==NULL){ printf("\n erro no acesso ao ficheiro \n"); return 0; }else{ fread(&total, sizeof(int), 1, f); fread(b, sizeof(cliente), total, f); fclose(f); return total; } } int main() { printf("estruturas\n"); int totalClientes=0, escolha; cliente Banco[TAM]; totalClientes = ler_dados_binario(Banco); do{ escolha = menu(); switch(escolha){ case 1: adiciona_cliente(Banco,&totalClientes); break; case 2: elimina_cliente(Banco,&totalClientes); break; case 3: mostra_todos(Banco,totalClientes); break; case 4: procura_mais_rico(Banco,totalClientes); break; } }while(escolha != 5); guarda_dados_binario(Banco, totalClientes); return 0; }
versão hardcore onde NAO indico qual o numero de estruturas que existem e que vão ser guardadas no ficheiro
#include <stdio.h> #include <stdlib.h> #include <string.h> #define TAM 5 typedef struct dados{ char numeroConta[15]; char nome[50]; int montante; } cliente; int menu(){ int i; puts("1 - adiciona cliente"); puts("2 - elimina cliente"); puts("3 - lista clientes"); puts("4 - mostra mais rico"); puts("5 - terminar"); puts("Escolha uma opcao: "); do{ scanf(" %d", &i); }while(i <0 || i >5); return i; } cliente escreve_cliente(){ cliente t; printf("Qual o numero da conta?"); scanf(" %14s", t.numeroConta); printf("Qual o nome?"); scanf(" %99[^\n]", t.nome); printf("Qual o montante?"); scanf("%d", &(t.montante)); return t; } void adiciona_cliente(cliente tabC[], int *totalC){ if(*totalC>=TAM){ printf("tabela de cliente cheia"); }else{ tabC[*totalC] = escreve_cliente(); (*totalC)++; } } void mostra_todos(cliente tab[], int totalC){ if(totalC==0){ printf("nao existem clientes\n"); }else{ for(int i=0; i< totalC; i++){ printf("%s \t %s \t %d \n", tab[i].numeroConta, tab[i].nome, tab[i].montante); } } } void procura_mais_rico(cliente tab[], int totalC){ cliente maiorT; int aux=0, i=0; if(totalC==0){ printf("nao existem clientes\n"); }else{ maiorT.montante = tab[i].montante; for(; i< totalC; i++){ if(tab[i].montante > maiorT.montante ){ aux = i; } } printf("\no maior vem %d:\n" , aux); printf("%s \t %s \t %d \n", tab[aux].numeroConta, tab[aux].nome, tab[aux].montante); } } void elimina_cliente(cliente tab[], int *totalC){ char st[15]; int i; printf("Qual o numero da conta a eliminar? (%d)", *totalC); scanf(" %14s", st); if(totalC<0){ printf("nao existem clientes. nao se pode eliminar nada\n"); }else{ for(i=0; i < *totalC && strcmp(st, tab[i].numeroConta)!=0; i++) //serve para posicionar o i quando encontrei ; if(i==*totalC){ printf("cliente nao existe\n"); }else{ tab[i]=tab[*totalC-1]; //serve para arrastar o ultimo para a posição atual (*totalC)--; } } } void guarda_dados_binario(cliente *b, int total){ FILE *f; f = fopen("bancoBinario2.bin", "wb"); if(f==NULL){ printf("\n erro no acesso ao ficheiro \n"); return; }else{ fwrite(b, sizeof(cliente), total, f); fclose(f); } } int ler_dados_binario(cliente *b){ FILE *f; int total=0; cliente aux; f = fopen("bancoBinario2.bin", "rb"); if(f==NULL){ printf("\n erro no acesso ao ficheiro \n"); return 0; }else{ fread(&aux, sizeof(cliente), 1, f); while(feof(f) == 0){ b[total++]= aux; fread(&aux, sizeof(cliente), 1, f); } fclose(f); return total; } } int main() { printf("estruturas\n"); int totalClientes=0, escolha; cliente Banco[TAM]; totalClientes = ler_dados_binario(Banco); do{ escolha = menu(); switch(escolha){ case 1: adiciona_cliente(Banco,&totalClientes); break; case 2: elimina_cliente(Banco,&totalClientes); break; case 3: mostra_todos(Banco,totalClientes); break; case 4: procura_mais_rico(Banco,totalClientes); break; } }while(escolha != 5); guarda_dados_binario(Banco, totalClientes); return 0; }
Tags : C, Learn C, linguagem C
0 thoughts on “parte 4 – ficheiros (binários)”