1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[Duvida] Inserir, Ler, Editar e Eliminar ficheiros em C

Discussão em 'Programação' iniciada por Catrabinas, 12 de Fevereiro de 2008. (Respostas: 3; Visualizações: 8253)

  1. Catrabinas

    Catrabinas Power Member

    Olá pessoal!

    Tenho de criar um menu com Inserir, Ler, Editar e Eliminar ficheiros em c..
    O ler e inserir já estão feitos, mas o editar e eliminar não consegui.. alguem me pode ajudar? o programa é o seguinte:
    Código:
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    
    typedef struct {int Dia,Mes,Ano;}DATA;
    typedef struct pessoa
     {
     char Nome[100];
     int  Idade;
     int Salario;
     DATA Nasc;
     } PESSOA;
      void Inserir(PESSOA *p)
     {     
          printf("Qual o nome ? ");
          gets(p->Nome);
          gets(p->Nome);
          printf("Qual a idade ? ");
          scanf("%d",&p->Idade);
          printf("Qual o salario ? ");
          scanf("%d",&p->Salario);
          printf("Qual a data de nascimento ? ");
          scanf("%d %d %d",&p->Nasc.Dia,&p->Nasc.Mes,&p->Nasc.Ano);
     }
     void Editar(struct pessoa x)
     {
     printf("Ainda nao esta conluido!\n");
     }
    
     void Mostrar(struct pessoa x)
     {
          printf("Nome       : %s\n", x.Nome);
          printf("Idade      : %d\n", x.Idade);
          printf("Salario    : %d\n", x.Salario);
          printf("Dt. Nasc   : %d/%d/%d\n", x.Nasc.Dia,x.Nasc.Mes,x.Nasc.Ano);
     }
     void Eliminar(struct pessoa x)
     {
     printf("Eliminar ainda nao esta concluido!\n");
     }
     void gravaFich(struct pessoa x)
     {
      FILE *fp;
      /* Abrir o ficheiro Dados.DAT */
      if((fp = fopen("DADOS.DAT", "ab")) == NULL)
     {
      printf("Imposs¡vel criar\\abrir ficheiro %s \n", "DADOS.DAT");
      getch();
      exit(1);
     }
      /* Grava estrutura */
      if (fwrite(&x, sizeof(x), 1, fp) != 1)
     fprintf(stderr, "NÆo foram escritos os dados no ficheiro!!!\n");
      else
     printf("Foram escritos os dados no ficheiro!!!\n");
     }
     main()
     {
     char op;
     struct pessoa p;
     printf("1 - Inserir\n");
     printf("2 - Editar\n");
     printf("3 - Ver\n");
     printf("4 - Eliminar\n");
     scanf("%s",&op);
     switch (op)
     {
     case '1': Inserir(&p); gravaFich(p); getch();
     case '2': Editar(p); getch(); /*Como faço este???*/
     case '3': Mostrar(p); gravaFich(p); getch();
     case '4': Eliminar(p); getch(); /*Como faço este???*/
     }
      getch();
     }
    Muito obrigado!
     
    Última edição pelo moderador: 13 de Fevereiro de 2008
  2. zxsat

    zxsat Power Member

    Não existe nenhuma maneira de "apagar" parte de um ficheiro, nem em C nem em linguagem nenhuma. Não estou a falar de bases de dados, isso é outra história.

    Para "apagar" um registo de um ficheiro tens 2 hipoteses (básicas, há sempre maneiras realmente estranhas de fazer as coisas mais simples).

    a) Acrescentas na struct um bit (ou um char, que dá menos trabalho) que indica que o registo está "apagado". Tem a desvantagem que nunca elimina a informação, mas também tem a vantagem que permite des-apagar o registo.

    b) Sempre que apagas um registo tens que copiar TODO o ficheiro _excepto_ o registo apagado para outro ficheiro (temporário), eliminar o ficheiro original e fazer o rename do ficheiro temporário.

    Nota 1: Quando se usa a) normalmente implementa-se uma função de "purge" que é semelhante a b) mas que corre o ficheiro todo e copia apenas os que não estão marcados como apagados para o temporário, remove o original e faz o rename do temporário. Será à escolha do fraguês se se cria uma opção do menu para fazer isso, ou se se corre o purge automaticamente de vez em quando... Tipo quando o programa arranca conta o numero de registos apagados, quando o total for superior a 10% dos registos activos correr o purge automaticamente com uma simpática mensagem de "Optimizando ficheiros, aguarde por favor..." LOLOLOL.

    Nota 2: Usar b) só é viavel quando o nº de registos é relativamente baixo (com as velocidades de hoje em dia deve ser aceitavel para alguns milhares de registos, mas não para milhões) e apenas em condições single-user.
     
  3. apagar struct dum ficheiro

    boas..
    estou a estudando ling.C e tambem estou com problemas a apagar uma struct lida de um ficheiro..
    a opcao A parece me bem.. mas nao entendi como marco a estrutura com um char para depois ser lida pelo "purge" :S que nao faço ideia do que seja!!!
    se me pudesses explicar melhor.
    obrigado!!!
     
  4. Gostava de saber porque há a repetição do gets "printf("Qual o nome ? "); gets(p->Nome); gets(p->Nome); " e porque depois de introduzir os dados e seleccionar a opção mostrar a idade não aparece a mesma mas sim um número diferente e maior !?
    Obrigada.
     

Partilhar esta Página