Procedura anagrafica

di il
13 risposte

Procedura anagrafica

Salve , sono alle prese con questo esercizio dove per la prima volta sto usando le strutture appoggiandosi sui file. Il programma richiede :1. Immissione Persona; 2. Ricerca Persona; 3.Cancellazione persona; 4. Visualizza Anagrafe. Il prime e il quarto punto funzionano correttamente, invece il secondo e il terzo no. Ho provato diverse soluzioni e alla fine avevo pensato di aver fatto un codice corretto ma a quanto pare non è così . Potreste aiutarmi a capire l'errore?

2. Ricerca Persona
void ricerca(void){
char nome[DIM], cognome[DIM];
int eta;
int n, fine;

printf("Ricerca persona:\n");
printf("Inserisci Nome: ");
gets(nome);
printf("Inserisci Cognome: ");
gets(cognome);
printf("Inserisci Eta': ");
scanf("%d", &eta);

  fp=fopen("Anagrafe.txt", "r");
  if(fp==NULL){
    perror("Errore in apertura da file!\n");
    exit(1);
  }

 do{
  n=fread(&anag, sizeof(struct persona), 1, fp);
   if(n==0)
    fine=1;
   else{
    if(strcmp(nome,anag.nome)==0)
      if(strcmp(cognome,anag.cognome)==0)
        if(eta==anag.eta){
          printf("La persone cercata e' presente nell'anagrafe.\n");
         }
         else{
          printf("La persone cercata non e' presente nell'anagrafe...\n\n");
         }
  }
 }while(n!=0);
}
3.Cancellazione persona
void cancellazione(void){
char nome[DIM], cognome[DIM];
int eta;
char pausa;
int n, fine;
FILE *fp;

printf("Cerca persona da elminare:\n");
printf("Inserisci Nome: ");
gets(nome);
printf("Inserisci Cognome: ");
gets(cognome);
printf("Inserisci Eta': ");
scanf("%d", &eta);

 fp=fopen("Anagrafe.txt", "r+");
  if(fp==NULL){
    perror("Errore in apertura da file!\n");
    exit(1);
  }

 do{
  n=fread(&anag, sizeof(struct persona), 1, fp);
   if(n==0)
    fine=1;

    if(strcmp(nome,anag.nome)==0)
      if(strcmp(cognome,anag.cognome)==0)
        if(eta==anag.eta){
           printf("La persone cercata e' presente nell'anagrafe.\n");
           printf("Vuoi elimiare davvero questa persona?\n");
           printf("Digitia S/N: ");
           scanf("%c", &pausa);
           if(pausa=='s' || pausa=='S'){
            strcmp(anag.nome, "");
            strcmp(anag.cognome, "");
            strcmp(anag.indirizzo, "");
            anag.eta = 0;
            fwrite(&anag, sizeof(struct persona), 1, fp);
            fclose(fp);
           }
         }
          else{
          printf("La persone cercata non e' presente nell'anagrafe...\n\n");
         }
 }while(n!=0);
}

13 Risposte

  • Re: Procedura anagrafica

    Devi postare le strutture, il main e le altre funzioni altrimenti come si fa a capire?
  • Re: Procedura anagrafica

    Hai ragione, scusami. Ecco tutto il codice completo...
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    /*Procedura anagrafica*/
    
    #define DIM 100
    
    struct persona{
     char nome[DIM];
     char cognome[DIM];
     char indirizzo[DIM];
     int eta;
    };
    struct persona anag;
    FILE *fp;
    
    void vis_per(void);
    void immissione(void);
    void ricerca(void);
    void cancellazione(void);
    void visualizzazione(void);
    
    int main(){
    int tasto;
    do{
     system("cls");
     printf("--->\t\tMENU'\t\t<---");
     printf("\nPROCEDURA ANAGRAFICA:\n");
     printf("1. Immissione Persona\n");
     printf("2. Ricerca Persona\n");
     printf("3. Cancellazione persona\n");
     printf("4. Visualizza Anagrafe\n");
     printf("5. Fine\n");
     printf("Inserisci la tua scelta: ");
     scanf("%d", &tasto);
    
    fflush(stdin);
    system("cls");
    
     switch(tasto){
      case 1:
       immissione();
       printf("Scrittura eseguita con successo. Verifica guardando nel file...\n\n");
      break;
    
      case 2:
       ricerca();
      break;
    
      case 3:
       cancellazione();
      break;
    
      case 4:
       visualizzazione();
      break;
    
      case 5:
       printf("\nArrivederci...\n");
      break;
    
      default:
       printf("Tasto inesistente...\nRIPROVA...\n\n");
       break;
     }
    
     if(tasto!=5){
      system("pause");
     }
     fflush(stdin);
    }while(tasto!=5);
    
    return 0;
    }
    
    void immissione(void){
     fp=fopen("Anagrafe.txt", "a+");
      if(fp==NULL){
        perror("Errore in apertura da file!\n");
        exit(1);
      }
    
    printf("Inserimento persona:\n");
    printf("Nome: ");
    gets(anag.nome);
    printf("Cogome: ");
    gets(anag.cognome);
    printf("Indirizzo: ");
    gets(anag.indirizzo);
    printf("Eta': ");
    scanf("%d", &anag.eta);
    
    fprintf(fp, "%s\n", anag.nome);
    fprintf(fp, "%s\n", anag.cognome);
    fprintf(fp, "%s\n", anag.indirizzo);
    fprintf(fp, "%d\n\n", anag.eta);
    fclose(fp);
    }
    
    void ricerca(void){
    char nome[DIM], cognome[DIM];
    int eta;
    int n, fine;
    
    printf("Ricerca persona:\n");
    printf("Inserisci Nome: ");
    gets(nome);
    printf("Inserisci Cognome: ");
    gets(cognome);
    printf("Inserisci Eta': ");
    scanf("%d", &eta);
    
      fp=fopen("Anagrafe.txt", "r");
      if(fp==NULL){
        perror("Errore in apertura da file!\n");
        exit(1);
      }
    
     do{
      n=fread(&anag, sizeof(struct persona), 1, fp);
       if(n==0)
        fine=1;
       else{
        if(strcmp(nome,anag.nome)==0)
          if(strcmp(cognome,anag.cognome)==0)
            if(eta==anag.eta){
              printf("La persone cercata e' presente nell'anagrafe.\n");
             }
             else{
              printf("La persone cercata non e' presente nell'anagrafe...\n\n");
             }
      }
     }while(n!=0);
    }
    
    void cancellazione(void){
    char nome[DIM], cognome[DIM];
    int eta;
    char pausa;
    int n, fine;
    FILE *fp;
    
    printf("Cerca persona da elminare:\n");
    printf("Inserisci Nome: ");
    gets(nome);
    printf("Inserisci Cognome: ");
    gets(cognome);
    printf("Inserisci Eta': ");
    scanf("%d", &eta);
    
     fp=fopen("Anagrafe.txt", "r+");
      if(fp==NULL){
        perror("Errore in apertura da file!\n");
        exit(1);
      }
    
     do{
      n=fread(&anag, sizeof(struct persona), 1, fp);
       if(n==0)
        fine=1;
    
        if(strcmp(nome,anag.nome)==0)
          if(strcmp(cognome,anag.cognome)==0)
            if(eta==anag.eta){
               printf("La persone cercata e' presente nell'anagrafe.\n");
               printf("Vuoi elimiare davvero questa persona?\n");
               printf("Digitia S/N: ");
               scanf("%c", &pausa);
               if(pausa=='s' || pausa=='S'){
                strcmp(anag.nome, "");
                strcmp(anag.cognome, "");
                strcmp(anag.indirizzo, "");
                anag.eta = 0;
                fwrite(&anag, sizeof(struct persona), 1, fp);
                fclose(fp);
               }
             }
              else{
              printf("La persone cercata non e' presente nell'anagrafe...\n\n");
             }
     }while(n!=0);
    }
    
    void vis_per(void){
      printf("Visualizzazione:\n");
      printf("///////////////////////////////\n");
      printf("%s", anag.nome);
      printf("%s", anag.cognome);
      printf("%s", anag.indirizzo);
      printf("%d", anag.eta);
      printf("\n///////////////////////////////\n\n");
    }
    
    void visualizzazione(void){
    FILE *fp;
    int n, fine;
    
     fp=fopen("Anagrafe.txt", "r");
      if(fp==NULL){
        perror("Errore in apertura da file!\n");
        exit(1);
      }
    
     do{
      n=fread(&anag, sizeof(struct persona), 1, fp);
       if(n==0)
        fine=1;
    
      vis_per();
      }while(n!=0);
    
     fclose(fp);
    }
    
  • Re: Procedura anagrafica

    Non manca niente?
  • Re: Procedura anagrafica

    Avevo letto solo struttura , ho modificato il msg precedente
  • Re: Procedura anagrafica

    Non puoi usare fprintf e fread.

    Devi usare fprintf/fscanf oppure fwrite/fread.

    Riscrivi il codice correttamente ...
  • Re: Procedura anagrafica

    Nelle funzioni dove ho esposto il problema non ho usato la fprintf/fscanf ma nelle altre che funzionano correttamente
  • Re: Procedura anagrafica

    Il problema e' nella ricerca della persona perche' nel momento in cui inserisco i dati non svolge nessuna funzione. Quindi vorrei capire se sbaglio qualcosa nel ragionamento che ho applicato
  • Re: Procedura anagrafica

    Fose non mi sono spiegato prima ...

    Nella funzione "immissione" usi la fprintf ... quindi nella "ricerca" NON puoi usare la fread.

    E' proprio per questo che la ricerca non funziona.

    Ok?
  • Re: Procedura anagrafica

    Ho tolto tutte le fprintf dalla funzione immissione mettendo la funzione fwrite
    fwrite(&anag, sizeof(struct persona), 1, fp);
    quando avvio il programma e dal menu' scelgo ricerca persona non mi da nessuna notizia e spunta soltanto
    Premi un tasto per continuare...
  • Re: Procedura anagrafica

    Ovviamente devi

    1) cancellare il vecchio file dati
    2) scrivere un nuovo dato con l'immissione
    3) fare una ricerca

    Dato che ci sei, facci vedere il codice modificato
  • Re: Procedura anagrafica

    oregon ha scritto:


    Ovviamente devi

    1) cancellare il vecchio file dati
    2) scrivere un nuovo dato con l'immissione
    3) fare una ricerca
    Pensavo che funzionasse sul vecchio file. Comunque io nell'immissione avevo utilizzato la fprintf perchè con la fwrite non inserisce l'età e invece di inserire il numero corretto mette soltanto dei simboli
  • Re: Procedura anagrafica

    La fwrite/fread lavorano in binario. I numeri sono corretti, non preoccuparti, ma non potrai vederli con un editor di testo (tipo notepad).

    Altrimenti devi cancellare il file e operare con fprintf / fscanf.
  • Re: Procedura anagrafica

    Ok grazie per le informazioni e per la pazienza
Devi accedere o registrarti per scrivere nel forum
13 risposte