Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* SISTC T1 - Armazenamento de registos de automóveis num ficheiro
- 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).
- 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). */
- // Apple Xcode
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #define MATRICULA_BUFFER_SIZE 6
- #define NAME_BUFFER_SIZE 80
- #define NAME_FILE "data.txt"
- /* estrutura */
- typedef struct
- {
- char matricula[MATRICULA_BUFFER_SIZE];
- char proprietario[NAME_BUFFER_SIZE];
- char apagado; //iniciar a 0 ('\0'). Diferente de zero significa apagado.
- } veiculo_t;
- void ler_registo(veiculo_t *v)
- {
- /* cria novo registo */
- char the_matricula[MATRICULA_BUFFER_SIZE + 2]; // 6 + 2
- char the_proprietario[NAME_BUFFER_SIZE];
- printf("\n\n## novo registo ##\n");
- printf("matricula: ");
- fgets(the_matricula, MATRICULA_BUFFER_SIZE + 2, stdin); // stdin -> teclado, 6 + 2
- memcpy(v->matricula, the_matricula, MATRICULA_BUFFER_SIZE);
- printf("proprietario: ");
- fgets(the_proprietario, NAME_BUFFER_SIZE, stdin); // stdin -> teclado
- memcpy(v->proprietario, the_proprietario, NAME_BUFFER_SIZE);
- v->apagado = '0';
- }
- void imprimir_registo(veiculo_t *v)
- {
- /* imprime os valores da estrutura */
- printf("\nmatricula = ");
- fwrite(v->matricula, MATRICULA_BUFFER_SIZE, 1, stdout);
- printf("\nproprietario = %s\n", v->proprietario);
- }
- void grava_ficheiro(veiculo_t v)
- {
- /* grava a estrutura no ficheiro */
- ler_registo(&v);
- FILE *the_file;
- the_file = fopen(NAME_FILE, "a+b"); // a+: adiciona a informacao ao fim do ficheiro, b: binario
- if (fwrite(&v, sizeof(v), 1, the_file) != 1)
- {
- printf("erro: gravacao no ficheiro sem sucesso\n");
- }
- /* conclui ficheiro */
- fclose(the_file);
- }
- void pre_imprimir_registo(veiculo_t v)
- {
- // imprime os valores que se encontram no ficheiro
- printf("\n\n## registos ##\n");
- // abrir o ficheiro
- FILE *the_file;
- the_file = fopen(NAME_FILE, "rb");
- if (the_file != NULL)
- {
- // informativo: tamanho do ficheiro (informativo apenas)
- fseek(the_file, 0, SEEK_END);
- int the_file_size = ftell(the_file);
- printf("ficheiro: %i bytes\n", the_file_size);
- // reset a posicao do ponteiro no ficheiro
- rewind(the_file);
- // faz o output dos valores
- while (fread(&v, sizeof(v), 1, the_file) == 1)
- {
- // mostra se nao esta "apagado"
- if (v.apagado == '0')
- {
- imprimir_registo(&v);
- }
- }
- fclose(the_file);
- }
- else
- {
- // ficheiro nao encontrado
- printf("erro: ficheiro nao encontrado\n");
- }
- }
- void apaga_registo()
- {
- // apaga um registo a partir do campo matricula
- veiculo_t v;
- // insercao da matricula a pesquisar
- char the_matricula[MATRICULA_BUFFER_SIZE + 2]; // 6 + 2
- printf("\n\nmatricula: ");
- fgets(the_matricula, MATRICULA_BUFFER_SIZE + 2, stdin); // 6 + 2
- // inicio da abertura do ficheiro, pesquisa e apagar
- printf("\nmatricula a pesquisar: %s\n", the_matricula);
- // abrir o ficheiro
- FILE *the_file;
- the_file = fopen(NAME_FILE, "r+b");
- if (the_file != NULL)
- {
- while (fread(&v, sizeof(v), 1, the_file) == 1)
- {
- // se matricula encontrada ...
- if (memcmp(v.matricula, the_matricula, MATRICULA_BUFFER_SIZE) == 0)
- {
- // verifica a posicao do cursor e anda para tras 1 "unidade"
- // porque o "apagar" fica na ultima posicao da estrutura
- fseek(the_file, -1, SEEK_CUR);
- // grava o char 1 no ficheiro
- fputc('1', the_file);
- // garante que o que foi escrito no ficheiro
- fflush(the_file);
- printf("processo concluido\n");
- }
- }
- // conclui ficheiro
- fclose(the_file);
- }
- else
- {
- // ficheiro nao encontrado
- printf("erro: ficheiro nao encontrado\n");
- }
- }
- int main (int argc, const char * argv[])
- {
- // menu principal
- veiculo_t v1;
- int the_flag = 1;
- int the_option = 0;
- // lista de opcoes
- while (the_flag)
- {
- printf("\n\n## menu ##\n");
- printf("1: ler registo\n");
- printf("2: imprimir registo\n");
- printf("3: apagar registo\n");
- printf("4: sair\n");
- printf("opcao: ");
- scanf("%i", &the_option);
- getchar(); // eliminar o bug do enter no scanf
- switch (the_option)
- {
- case 1:
- // insere registo no ficheiro
- grava_ficheiro(v1);
- break;
- case 2:
- // lista os registos do ficheiro
- pre_imprimir_registo(v1);
- break;
- case 3:
- // coloca registo como apagado
- apaga_registo();
- break;
- case 4:
- // sai do programa
- the_flag = 0;
- break;
- default:
- // se o utilizador escolher uma opcao invalida
- printf("\nerro: escolher entre 1 e 4\n\n");
- break;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement