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

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:
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.
 
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!!!
 
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.
 
Back
Topo