Advertisement
hmcristovao

Lista 11 - exemplo 4

Aug 20th, 2013
389
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.37 KB | None | 0 0
  1. /* Cadastro persistente de dados e uso de TAD.
  2.  
  3.    Transfere dados da memória principal (vetor de ponteiros para estruturas)
  4.    para a memória secundária (arquivo texto) e vice-versa.
  5. */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9.  
  10. #define MAX_TAM_NOME_ARQUIVO 30
  11. #define MAX_QTDE_NOMES 1000
  12. #define MAX_NOME 31
  13. #define MAX_TELEFONE 9
  14. #define ARQUIVO_DEFAULT "dados.txt"
  15.  
  16. typedef struct {
  17.    char  nome[MAX_NOME];
  18.    char  tel[MAX_TELEFONE];
  19.    int   dia, mes, ano;
  20.    float valor;
  21. } Registro;
  22.  
  23. typedef struct {
  24.    int qtde;
  25.    Registro *vetor[MAX_QTDE_NOMES];  // os elementos do vetor são ponteiros
  26. } Lista;
  27.  
  28. // protótipos:
  29. void inicia(Lista *lista);
  30. int menu(void);
  31. void pausa(void);
  32. int carrega(char *nomeArquivo, Lista *lista);
  33. void inclui(Lista *lista);
  34. int salva(char *nomeArquivo, Lista *lista);
  35. void exibeLista(Lista *lista);
  36. void exibeRegistro(Registro *reg);
  37.  
  38. /*-----------------------------------------------------------------------*/
  39. int main(int argc, char *argv[]) {
  40. /*
  41. Objetivo  : função principal - apresenta o menu de opções.
  42. Argumentos: argc - número de argumentos: 2 (nome do prog e nome do arquivo)
  43.             argv - nome do arquivo
  44. Retorno   : 0 se execução com sucesso.
  45.             1 se erro.
  46. */
  47.    Lista lista; // cria uma lista: vetor de ponteiros para a estrutura Registro, e a qtde de elementos
  48.    inicia(&lista);  // zera a qtde de registros da lista
  49.    char nomeArquivo[MAX_TAM_NOME_ARQUIVO];  /* contem o nome do arquivo em disco */
  50.  
  51.    // verifica qtde de argumentos da linha de comandos
  52.    // se maior que 2 então acusa erro e indica o uso correto
  53.    if(argc > 2) {
  54.       printf("Erro na chamada!\nCorreto: %s <nome_do_arquivo>\n"
  55.              "Obs.: considera \"%s\" na falta de nome",
  56.              argv[0], ARQUIVO_DEFAULT);
  57.       return 1;  // o código "1" representa saída com erro
  58.    }
  59.    // se o nome do arquivo não for passado, considera o nome default (ARQUIVO_DEFAULT)
  60.    else if(argc == 1)
  61.       strcpy(nomeArquivo, ARQUIVO_DEFAULT);
  62.    else // se argc==2 então considera o nome do arquivo passado na linha de comandos
  63.       strcpy(nomeArquivo, argv[1]);
  64.  
  65.    // carrega os dados do arquivo para a memória principal: lista (vetor de ponteiros para estrutura)
  66.    if(carrega(nomeArquivo, &lista) == 0)
  67.       return 1;
  68.  
  69.    // exibe o menu e classifica a opção selecionada
  70.    int opcao;
  71.    do {
  72.       opcao = menu();
  73.       switch( opcao )
  74.       {
  75.          case 1 : inclui(&lista);             break;
  76.          case 2 : exibeLista(&lista);         break;
  77.          case 3 : salva(nomeArquivo, &lista); break;
  78.       }
  79.    }while(opcao != 3 && opcao != 4);
  80.    printf("\nFim!\n");
  81.  
  82.    return 0;
  83. }
  84.  
  85. /*----------------------------------------------------------------------*/
  86. void inicia(Lista *lista) {
  87. /*
  88. Objetivo  : inicializar a lista, ajustando a qtde para zero
  89. Argumentos: lista - ponteiro para estrutura do tipo Lista que contem os registros e a qtde.
  90. Retorno   : nenhum.
  91. */
  92.     lista->qtde = 0;
  93. }
  94.  
  95. /*----------------------------------------------------------------------*/
  96. int menu(void) {
  97. /*
  98. Objetivo  : apresentar o menu e retornar o numero da opcao escolhida.
  99. Argumentos: nenhum.
  100. Retorno   : numero da opcao escolhida.
  101. */
  102.    printf("\n------------------------------------------");
  103.    printf("\nMENU DE OPCOES");
  104.    printf("\nInclui novas informacoes...............[1]");
  105.    printf("\nExibe os dados no video................[2]");
  106.    printf("\nSai e salva alteracoes.................[3]");
  107.    printf("\nSai sem salvar alteracoes..............[4]");
  108.    printf("\n------------------------------------------");
  109.    printf("\nQual a opcao? ");
  110.    int opcao;
  111.    do {
  112.       scanf("%d", &opcao);
  113.    }while(opcao < 1  ||  opcao > 4);
  114.    fflush(stdin);
  115.    return opcao;
  116. }
  117.  
  118. /*----------------------------------------------------------------------*/
  119. void pausa(void) {
  120. /*
  121. Objetivo  : fazer uma pausa no processamento.
  122. Argumentos: nenhum.
  123. Retorno   : nenhum.
  124. */
  125.    printf("Tecle ENTER para continuar...");
  126.    getchar();
  127. }
  128.  
  129. /*----------------------------------------------------------------------*/
  130. int carrega(char *nomeArquivo, Lista *lista) {
  131. /*
  132. Objetivo  : copiar os registros da memoria auxiliar (arquivo: nome) para a
  133.             memoria principal (vetor de poteiros: dados).
  134. Argumentos: nomeArquivo - nome do arquivo que contem os registros.
  135.             lista - ponteiro para estrutura do tipo Lista que contem os registros e a qtde.
  136. Retorno   : 1 se tudo ok, ou zero se arquivo nao pôde ser criado/aberto.
  137. */
  138.    char aux[10];
  139.    FILE *fp;
  140.    // se o arquivo não existe
  141.    if((fp = fopen(nomeArquivo,"r")) == 0) {
  142.       printf("Arquivo %s nao encontrado, Deseja cria-lo ? (s/n) ", nomeArquivo);
  143.       gets(aux);
  144.       if( aux[0] == 's' ||  aux[0] == 'S') {
  145.          if((fp = fopen(nomeArquivo,"w")) == 0) {
  146.             printf("Arquivo %s nao pode ser criado", nomeArquivo);
  147.             return 0;
  148.          }
  149.          else {
  150.             printf("%s foi criado com sucesso!\n", nomeArquivo);
  151.             pausa();
  152.             return 1;
  153.          }
  154.       }
  155.       // se o usuário não quer criar, retorna com código zero
  156.       else
  157.          return 0;
  158.    }
  159.    // se o arquivo existe, então le os seus dados
  160.    int i = 0, status;
  161.    while(1) {
  162.       // malloc retorna zero se não há memória disponível
  163.       if( !(lista->vetor[i]=(Registro*)malloc(sizeof(Registro))) ) {
  164.          printf("\n\nFalta memoria !\n");
  165.          return 0;
  166.       }
  167.       /* fscanf retorna qtde de informacoes lidas, ou EOF */
  168.       status = fscanf(fp, "%30s %8s %d %d %d %f", lista->vetor[i]->nome,
  169.                lista->vetor[i]->tel,  &lista->vetor[i]->dia, &lista->vetor[i]->mes,
  170.                &lista->vetor[i]->ano, &lista->vetor[i]->valor);
  171.       if(status == EOF)
  172.          break;
  173.       i++;
  174.    }
  175.    fclose(fp);
  176.    printf("%d registro(s) recurerado(s)\n", i);
  177.    lista->qtde = i;
  178.    pausa();
  179.    return 1;
  180. }
  181.  
  182. /*----------------------------------------------------------------------*/
  183. void inclui(Lista *lista) {
  184. /*
  185. Objetivo  : incluir novos registros no vetor de ponteiros.
  186. Argumentos: lista - ponteiro para estrutura do tipo Lista que contem os registros e a qtde.
  187. Retorno   : nenhum.
  188. */
  189.    char aux[MAX_NOME];
  190.    int i = lista->qtde;
  191.    while(1) {
  192.       printf("\n\n\n\t\tENTRADA DE DADOS");
  193.       printf("\n\nREGISTRO: %d", i+1);
  194.       printf("\nEntre com o nome (maximo 30 caracteres) - ENTER sai: ");
  195.       fflush(stdin);
  196.       gets(aux);
  197.       if(strlen(aux) == 0)
  198.          break;
  199.       // se nome não foi vazio, aloca memória para mais um elemento na lista:
  200.       if( !(lista->vetor[i]=(Registro*)malloc(sizeof(Registro))) ) {
  201.          printf("\n\nFalta memoria !\n");
  202.          break;
  203.       }
  204.       // preenche a memória alocada
  205.       strcpy(lista->vetor[i]->nome, aux);
  206.       printf("Entre com o telefone (maximo 8 caracteres): ");
  207.       gets(lista->vetor[i]->tel);
  208.       printf("Entre com a data de nascimento (formato dd mm aa): ");
  209.       scanf("%d %d %d",&lista->vetor[i]->dia, &lista->vetor[i]->mes, &lista->vetor[i]->ano);
  210.       printf("Entre com o valor: ");
  211.       scanf("%f", &lista->vetor[i]->valor);
  212.       i++;
  213.    }
  214.    // atualiza a qtde de registros da lista
  215.    lista->qtde = i;
  216. }
  217.  
  218. /*----------------------------------------------------------------------*/
  219. int salva(char *nomeArquivo, Lista *lista) {
  220. /*
  221. Objetivo  : salvar os registros para a memoria auxiliar.
  222. Argumentos: nomeArquivo - nome do arquivo que ira armazenar os registros.
  223.             lista - ponteiro para estrutura do tipo Lista que contem os registros e a qtde
  224. Retorno   : 0 se o arquivo nao pode ser criado/aberto, ou 1 se ok.
  225. */
  226.    int i;
  227.    FILE *fp;
  228.  
  229.    if((fp = fopen(nomeArquivo,"w")) == 0){
  230.       printf("Erro em %s, os dados nao foram salvos", nomeArquivo);
  231.       pausa();
  232.       return 0;
  233.    }
  234.    for (i = 0; i < lista->qtde; i++)
  235.       // "%-30s" alinha o nome a esquerda dentro de 30 espaços
  236.       // "%02d" preenche com zeros a esquerda em dois dígitos
  237.       fprintf(fp, "%-30s %-8s %02d %02d %02d %7.3f\n",lista->vetor[i]->nome,
  238.               lista->vetor[i]->tel, lista->vetor[i]->dia, lista->vetor[i]->mes,
  239.               lista->vetor[i]->ano, lista->vetor[i]->valor);
  240.    fclose(fp);
  241.    printf("%d registro(s) gravado(s)\n", lista->qtde);
  242.    return 1;
  243. }
  244.  
  245. /*----------------------------------------------------------------------*/
  246. void exibeLista(Lista *lista) {
  247. /*
  248. Objetivo  : exibir todos os registros que estao no vetor
  249. Argumentos: lista - ponteiro para estrutura do tipo Lista que contem os registros e a qtde
  250. Retorno   : nenhum.
  251. */
  252.    int i;
  253.  
  254.    printf("\n\n\n-----------------------------------------------------"
  255.           "---------------\nDados cadastrados:\n\nNo  Nome"
  256.           "                           Telefone"
  257.           "      Data          Valor\n\n");
  258.    for(i = 0; i < lista->qtde; i++) {
  259.       printf("%d - ",i+1);
  260.       exibeRegistro(lista->vetor[i]);
  261.    }
  262.    printf("\n-----------------------------------------------------"
  263.           "---------------\n");
  264.    pausa();
  265.    printf("\n\n");
  266. }
  267.  
  268. /*----------------------------------------------------------------------*/
  269. void exibeRegistro(Registro *reg) {
  270. /*
  271. Objetivo  : exibir um registro
  272. Argumentos: reg - ponteiro para o registro que será exibido.
  273. Retorno   : nenhum.
  274. */
  275.    printf("%-30s %-8s      %02d/%02d/%02d    %7.3f\n",
  276.           reg->nome, reg->tel, reg->dia, reg->mes, reg->ano, reg->valor);
  277. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement