Advertisement
paulogp

SISTC T1 - Armazenamento de registos

Jul 13th, 2011
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.03 KB | None | 0 0
  1. /* SISTC T1 - Armazenamento de registos de automóveis num ficheiro
  2. Pretende-se escrever um programa que permita armazenar uma lista de registos de automóveis num ficheiro. Os dados a guardar para cada automóvel são a matrícula (vector de 6 caracteres) e o nome do proprietário (string).
  3. Implemente a opção de apagar registos. Para tal deverá atribuir o valor 0 ao campo "apagado" do registo a “apagar” (no fundo só fica escondido, técnica conhecida como “eliminação "preguiçosa"). Deverá ser pedida a matrícula correspondente ao registo a eliminar (considere que não existem repetições de matrículas). */
  4.  
  5. // Apple Xcode
  6.  
  7.  
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include <stdlib.h>
  11.  
  12. #define MATRICULA_BUFFER_SIZE 6
  13. #define NAME_BUFFER_SIZE 80
  14. #define NAME_FILE "data.txt"
  15.  
  16. /* estrutura */
  17. typedef struct
  18. {
  19.     char matricula[MATRICULA_BUFFER_SIZE];
  20.     char proprietario[NAME_BUFFER_SIZE];
  21.     char apagado; //iniciar a 0 ('\0'). Diferente de zero significa apagado.
  22. } veiculo_t;
  23.  
  24. void ler_registo(veiculo_t *v)
  25. {
  26.     /* cria novo registo */
  27.     char the_matricula[MATRICULA_BUFFER_SIZE + 2]; // 6 + 2
  28.     char the_proprietario[NAME_BUFFER_SIZE];
  29.  
  30.     printf("\n\n## novo registo ##\n");
  31.  
  32.     printf("matricula: ");
  33.     fgets(the_matricula, MATRICULA_BUFFER_SIZE + 2, stdin); // stdin -> teclado, 6 + 2
  34.     memcpy(v->matricula, the_matricula, MATRICULA_BUFFER_SIZE);
  35.  
  36.     printf("proprietario: ");
  37.     fgets(the_proprietario, NAME_BUFFER_SIZE, stdin); // stdin -> teclado
  38.     memcpy(v->proprietario, the_proprietario, NAME_BUFFER_SIZE);
  39.  
  40.     v->apagado = '0';
  41. }
  42.  
  43. void imprimir_registo(veiculo_t *v)
  44. {
  45.     /* imprime os valores da estrutura */
  46.     printf("\nmatricula = ");
  47.     fwrite(v->matricula, MATRICULA_BUFFER_SIZE, 1, stdout);
  48.  
  49.     printf("\nproprietario = %s\n", v->proprietario);
  50. }
  51.  
  52. void grava_ficheiro(veiculo_t v)
  53. {
  54.     /* grava a estrutura no ficheiro */
  55.     ler_registo(&v);
  56.  
  57.     FILE *the_file;
  58.  
  59.     the_file = fopen(NAME_FILE, "a+b"); // a+: adiciona a informacao ao fim do ficheiro, b: binario
  60.     if (fwrite(&v, sizeof(v), 1, the_file) != 1)
  61.     {
  62.         printf("erro: gravacao no ficheiro sem sucesso\n");
  63.     }
  64.  
  65.     /* conclui ficheiro */
  66.     fclose(the_file);
  67. }
  68.  
  69. void pre_imprimir_registo(veiculo_t v)
  70. {
  71.     // imprime os valores que se encontram no ficheiro
  72.     printf("\n\n## registos ##\n");
  73.  
  74.     // abrir o ficheiro
  75.     FILE *the_file;
  76.     the_file = fopen(NAME_FILE, "rb");
  77.  
  78.     if (the_file != NULL)
  79.     {
  80.         // informativo: tamanho do ficheiro (informativo apenas)
  81.         fseek(the_file, 0, SEEK_END);
  82.         int the_file_size = ftell(the_file);
  83.         printf("ficheiro: %i bytes\n", the_file_size);
  84.  
  85.         // reset a posicao do ponteiro no ficheiro
  86.         rewind(the_file);
  87.  
  88.         // faz o output dos valores
  89.         while (fread(&v, sizeof(v), 1, the_file) == 1)
  90.         {
  91.             // mostra se nao esta "apagado"
  92.             if (v.apagado == '0')
  93.             {
  94.                 imprimir_registo(&v);
  95.             }
  96.         }
  97.  
  98.         fclose(the_file);
  99.     }
  100.     else
  101.     {
  102.         // ficheiro nao encontrado
  103.         printf("erro: ficheiro nao encontrado\n");
  104.     }
  105. }
  106.  
  107. void apaga_registo()
  108. {
  109.     // apaga um registo a partir do campo matricula
  110.     veiculo_t v;
  111.  
  112.     // insercao da matricula a pesquisar
  113.     char the_matricula[MATRICULA_BUFFER_SIZE + 2]; // 6 + 2
  114.  
  115.     printf("\n\nmatricula: ");
  116.     fgets(the_matricula, MATRICULA_BUFFER_SIZE + 2, stdin); // 6 + 2
  117.  
  118.     // inicio da abertura do ficheiro, pesquisa e apagar
  119.     printf("\nmatricula a pesquisar: %s\n", the_matricula);
  120.  
  121.     // abrir o ficheiro
  122.     FILE *the_file;
  123.     the_file = fopen(NAME_FILE, "r+b");
  124.  
  125.     if (the_file != NULL)
  126.     {
  127.         while (fread(&v, sizeof(v), 1, the_file) == 1)
  128.         {
  129.             // se matricula encontrada ...
  130.             if (memcmp(v.matricula, the_matricula, MATRICULA_BUFFER_SIZE) == 0)
  131.             {
  132.                 // verifica a posicao do cursor e anda para tras 1 "unidade"
  133.                 // porque o "apagar" fica na ultima posicao da estrutura
  134.                 fseek(the_file, -1, SEEK_CUR);
  135.  
  136.                 // grava o char 1 no ficheiro
  137.                 fputc('1', the_file);
  138.  
  139.                 // garante que o que foi escrito no ficheiro
  140.                 fflush(the_file);
  141.  
  142.                 printf("processo concluido\n");
  143.             }
  144.         }
  145.  
  146.         // conclui ficheiro
  147.         fclose(the_file);
  148.     }
  149.     else
  150.     {
  151.         // ficheiro nao encontrado
  152.         printf("erro: ficheiro nao encontrado\n");
  153.     }
  154. }
  155.  
  156. int main (int argc, const char * argv[])
  157. {
  158.     // menu principal
  159.     veiculo_t v1;
  160.  
  161.     int the_flag = 1;
  162.     int the_option = 0;
  163.  
  164.     // lista de opcoes
  165.     while (the_flag)
  166.     {
  167.         printf("\n\n## menu ##\n");
  168.         printf("1: ler registo\n");
  169.         printf("2: imprimir registo\n");
  170.         printf("3: apagar registo\n");
  171.         printf("4: sair\n");
  172.  
  173.         printf("opcao: ");
  174.         scanf("%i", &the_option);
  175.         getchar(); // eliminar o bug do enter no scanf
  176.  
  177.         switch (the_option)
  178.         {
  179.             case 1:
  180.                 // insere registo no ficheiro
  181.                 grava_ficheiro(v1);
  182.                 break;
  183.             case 2:
  184.                 // lista os registos do ficheiro
  185.                 pre_imprimir_registo(v1);
  186.                 break;
  187.             case 3:
  188.                 // coloca registo como apagado
  189.                 apaga_registo();
  190.                 break;
  191.             case 4:
  192.                 // sai do programa
  193.                 the_flag = 0;
  194.                 break;
  195.             default:
  196.                 // se o utilizador escolher uma opcao invalida
  197.                 printf("\nerro: escolher entre 1 e 4\n\n");
  198.                 break;
  199.         }
  200.     }
  201.  
  202.     return 0;
  203. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement