83> Gestione di un'anagrafica "anagrafica.dat"
(cognome, nome, indirizzo,eta)
1. Inserimento
2. Modifica
3. Cancellazione
4. Ricerca
5. Visualizzazione
0. Fine

avrete bisogno di:
ftell()
fseek()
fread()
fwrite()

e delle aperture(vi conviene fare in modo che
ogni function apra e chiuda il file nel modo opportuno):
r
r+
a+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define DIM 10

struct anagrafica{
  char nome[20];
  char cognome[20];
  char indirizzo[30];
  char eta[3];
}persona;

int Ricerca(struct anagrafica);
void Inserimento();
void Modifica(struct anagrafica);
void Cancellazione(struct anagrafica);
void Visualizzazione();

int main(){
  struct anagrafica persona_temp;
  int scelta;
  while(1){
    printf("\n1. Inserimento");
    printf("\n2. Modifica");
    printf("\n3. Cancellazione");
    printf("\n4. Ricerca ");
    printf("\n5. Visualizzazione");
    printf("\n0. Fine\n");
    printf("\nScelta: ");
    scanf("%d",&scelta);
    fflush(stdin);
    switch(scelta){
      case 1:
        Inserimento();
        break;
      case 2:
        Modifica(persona_temp);
        break;
      case 3:
        printf("\nNome:");
        scanf("%s", persona_temp.nome);
        fflush(stdin);

        printf("\nCognome:");
        scanf("%s", persona_temp.cognome);
        fflush(stdin);

        printf("\nIndirizzo:");
        gets(persona_temp.indirizzo);
        fflush(stdin);

        printf("\nEta':");
        scanf("%s", persona_temp.eta);
        fflush(stdin);
        Cancellazione(persona_temp);
        break;
      case 4:
        printf("\nNome:");
        scanf("%s", persona_temp.nome);
        fflush(stdin);

        printf("\nCognome:");
        scanf("%s", persona_temp.cognome);
        fflush(stdin);

        printf("\nIndirizzo:");
        gets(persona_temp.indirizzo);
        fflush(stdin);

        printf("\nEta':");
        scanf("%s", persona_temp.eta);
        fflush(stdin);
        if(Ricerca(persona_temp)==-1){
          printf("\nPersona non trovata\n\n");
        } else {
          printf("\nPersona trovata\n\n");
        }
        break;
      case 5:
        Visualizzazione();
        break;
      case 0:
        return 0;
        break;
      default:
        printf("Scelta non valida");
        break;
    }
  }
  return 0;
}

void Inserimento(){
  FILE *fp;
  fp=fopen("anagrafica.txt", "a");
  if(fp==NULL){ perror("Errore"); exit(1); }

  printf("\nNome:");
  scanf("%s", persona.nome);
  fflush(stdin);

  printf("\nCognome:");
  scanf("%s", persona.cognome);
  fflush(stdin);

  printf("\nIndirizzo:");
  gets(persona.indirizzo);
  fflush(stdin);

  printf("\nEta':");
  scanf("%s", persona.eta);
  fflush(stdin);

  fwrite(&persona, sizeof(struct anagrafica), 1, fp);
  

  fclose(fp);
}

void Modifica(struct anagrafica persona_temp){
  FILE *fp;
  fp=fopen("anagrafica.txt", "r+");
  if(fp==NULL){ perror("Errore"); exit(1); }
  int n;
  if((n=Ricerca(persona_temp))!=-1){
    fseek(fp, n*sizeof(struct anagrafica), SEEK_SET);
    fwrite(&persona_temp, sizeof(struct anagrafica), 1, fp);
  }
  fclose(fp);
}

void Cancellazione(struct anagrafica persona_temp){
  FILE *fp;
  fp=fopen("anagrafica.txt", "r+");
  if(fp==NULL){ perror("Errore"); exit(1); }
  int n;
  if((n=Ricerca(persona_temp))!=-1){
    FILE *fp2;
    fp2=fopen("anagrafica2.txt", "w");
    if(fp2==NULL){ perror("Errore"); exit(1); }
    int i=0;
    while(fread(&persona_temp, sizeof(struct anagrafica), 1, fp)!=0){
      if(i!=n){
        fwrite(&persona_temp, sizeof(struct anagrafica), 1, fp2);
      }
      i++;
    }
    fclose(fp2);
    fclose(fp);
    if(remove("anagrafica.txt")!=0){ perror("Errore nella cancellazione del file"); exit(1); }
    if(rename("anagrafica2.txt", "anagrafica.txt")!=0){ perror("Errore nella cancellazione del file"); exit(1); }
    if(remove("anagrafica2.txt")!=0){ perror("Errore nella cancellazione del file"); exit(1); }
  } else {
    fclose(fp);
  }
}

int Ricerca(struct anagrafica persona_temp){
  FILE *fp;
  fp=fopen("anagrafica.txt", "r");
  if(fp==NULL){ perror("Errore"); exit(1); }
  int c=0;
  while((fread(&persona, sizeof(struct anagrafica), 1, fp))!=0){
    if(strcmp(persona.nome, persona_temp.nome)==0 && strcmp(persona.cognome, persona_temp.cognome)==0 && strcmp(persona.indirizzo, persona_temp.indirizzo)==0 && strcmp(persona.eta, persona_temp.eta)==0){
      return c;
    }
    c++;
  }
  return -1;
  fclose(fp);
}

void Visualizzazione(){
  FILE *fp;
  fp=fopen("anagrafica.txt", "r");
  if(fp==NULL){ perror("Errore"); exit(1); }

  while((fread(&persona, sizeof(struct anagrafica), 1, fp))!=0){
    printf("\nNome: %s", persona.nome);
    printf("\nCognome: %s", persona.cognome);
    printf("\nIndirizzo: %s", persona.indirizzo);
    printf("\nEta': %s", persona.eta);
    printf("\n\n\n\n");
  }

  fclose(fp);
}
    
  
083.c