Newsgroup: it.comp.lang.c
Titolo: Ricerca in una struttura

Salve a tutti, sto facendo questo programma, è una rubrica telefonica, ma
alla ricerca dei nominativi mi da un errore di memoria: Unhandled exception
in Rubrica.exe: 0xC0000005: Access Violation..
Appena premo il numero 3 del menù mi da questo errore, sapete come lo posso
eliminare per far funzionare la ricerca?
#include<stdio.h>
#include<conio.h>
#include<string.h>
typedef struct{
 char nome[10];
 char cognome[10];
 int tel;
 int cel;
 int contr;
}Rubrica;
void main(){
 Rubrica p;
 p.cel=0;
 int scelta,t,f,n,j,scelta1,test=0;
 char ricerca[15];
 FILE *fp;
 while(scelta!=0){
  printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
  printf("\t\t\tRUBRICA TELEFONICA");
  printf("\n\n\n\t\t\t1. IMMISSIONE");
  printf("\n\n\t\t\t2. LETTURA");
  printf("\n\n\t\t\t3. RICERCA");
  printf("\n\n\t\t\t4. CANCELLAZIONE");
  printf("\n\n\t\t\t0. FINE");
  printf("\n\n\n\t\t\t\tInserire la scelta: ");
  scanf("%d",&scelta);
  printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
  switch(scelta){
  case 1: file://IMMISSIONE
   fp=fopen("Rubrica.dat","a+");//APRE IL FILE
   do{
    printf("INSERIMENTO NOMINATIVI\n\n");
    printf("Nome: ");
    gets(p.nome);
    gets(p.nome);
    printf("Cognome: ");
    gets(p.cognome);
    printf("Telefono: ");
    scanf("%d",&
p.tel
);
    printf("Cellulare: ");
    scanf("%d",&p.cel);
    p.contr=0;//SERVE PER LA CANCELLAZIONE
    fwrite(&p,sizeof(p),1,fp);//MEMORIZZA IL FILE
    fclose(fp);//CHIUDE IL FILE
    printf("\nVuoi inserire un altro nominativo? SI=1 NO=0: ");
    scanf("%d",&scelta1);
    printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
   }while(scelta1!=0);
   break;
  case 2: file://LETTURA
   fp=fopen("Rubrica.dat","r+b");
   if(fp==NULL)//CONTROLLO SE IL FILE ESISTE
    printf("\nIl file non esiste");
   else{
    fseek(fp,0,0);//PONE L'INDICE ALL'INIZIO
    t=f=0;
    printf("\nLETTURA RUBRICA\n\n\n");
    printf("_________________________________________________\n");
    printf("|N.|   NOME   | COGNOME  | TELEFONO | CELLULARE |\n");
    printf("|--+----------+----------+----------+-----------+");
    for(;;){
     t++;
     fseek(fp,0,SEEK_CUR);
     n=fread(&p,sizeof(p),1,fp);
     if(n==0){
      fclose(fp);//CHIUDE FP
      break;//FERMA IL FOR
     }
     else{
      file://STAMPA SINGOLO RECORD COMPRESI NEL FILE
      file://SE TEST-> SE P.CONTR=1 NON FA LEGGERE
      file://I RECORD CHE SONO ELIMINATI
      if(p.contr==0){
       printf("\n|%2d|%10s|%10s|%10d|%11d|",f,p.nome,p.cognome,
p.tel
,p.cel);
       printf("\n|--+----------+----------+----------+-----------|");
       f=f+1;
      }//ELSE
     }//FOR
    }//IF
   }//ELSE
   printf("\n");
   getch();
   break;
  case 3: file://RICERCA
   printf("RICERCA\n\n\n");
   printf("Inserire il cognome da ricercare: ");
   gets(ricerca);
   j=f=0;
   printf("\nLETTURA RUBRICA\n\n\n");
   printf("_________________________________________________\n");
   printf("|N.|   NOME   | COGNOME  | TELEFONO | CELLULARE |\n");
   printf("|--+----------+----------+----------+-----------+");
   do{
    n=fread(&p,sizeof(p),1,fp);
    f=f+1;
    if(n==0){
     strcpy(ricerca,"*A*");
     printf("\nLettura archivio terminata");
    }
    file://CONFRONTA SE RICERCACOGNOME E' UGUALE A P.COGNOME
    file://SE E' VERO TEST=0
    test=strcmp(p.cognome,ricerca);
    file://SOLO SE P.COGNOME=0 PASSA LA LETTURA DEL DATO
    file://AL CONTRARIO SIGNIFICA CANCELLATO
    if(p.contr==0){
     if(test==0){
      j=j+1;//VUOL DIRE CHE IL FILE E' STATO CREATO
      printf("\n|%2d|%10s|%10s|%10d|%11d|",f,p.nome,p.cognome,
p.tel
,p.cel);
      printf("\n|--+----------+----------+----------+-----------|");
     }
    }
   }while(n!=0);
   fclose(fp);
   if(j==0)
    printf("\nNon esiste nessun contatto comn questo nome\n\n");
   getch();
   break;
  }
 }
}

 ha scritto nel messaggio
news:ieBx8.58834$vF6.1...@news2.tin.it...



- main è int, non void
- il tuo programma non usa funzioni C++, se cambi un pò l'ordine ed i
commenti l'ho puoi compilare comme C.
Dan

   case 1: file://IMMISSIONE
Sta cosa cosa vorrebbe essere?
A me questo tipo di sintassi per il c mi suona nuova.
Che cos'č?
Claudio

 wrote in message
news:aa8g77$bq1$1...@lacerta.tiscalinet.it...

Il "file:" prima del commento? Lo aggiunge il newsreader quando trova "//"
Dan