Ecco il programma completo.
Cancella il tuo file della rubrica perché viene creato da zero. Metti anche il path giusto.
#include <stdio.h>
#include <string.h>
#define MAX_ELEMENTI 100
#define MAX_LEN_NOME 20
#define MAX_LEN_COGNOME 20
#define MAX_LEN_PHONE 12
struct dati { //STRUTTURA DATI RUBRICA
char nome[MAX_LEN_NOME];
char cognome[MAX_LEN_COGNOME];
char telefono[MAX_LEN_PHONE];
};
struct _rubrica
{
struct dati elenco[MAX_ELEMENTI];
int indiciUsati[MAX_ELEMENTI];
int indiceCorrente;
};
//Legge da file e salva in rubrica, ritorna il numero di elementi letti
int LeggiFile(FILE * f, struct _rubrica *rubrica)
{
while(fread(&(rubrica->elenco[rubrica->indiceCorrente]),sizeof(struct dati),1,f))
{
rubrica->indiciUsati[rubrica->indiceCorrente] = 1;
rubrica->indiceCorrente++;
}
return rubrica->indiceCorrente;
}
//Scrive su file leggendo da rubrica, ritorna il numero di elementi scritti
int ScriviFile(FILE * f, struct _rubrica *rubrica)
{
int i;
int scritti = 0;
for(i = 0; i < rubrica->indiceCorrente; i++)
{
if(rubrica->indiciUsati[i] == 1)
{
if(fwrite(&(rubrica->elenco[i]),sizeof(struct dati),1,f))
scritti++;
}
}
return scritti;
}
//Trova la prima posizione libera
int TrovaPosizione(struct _rubrica *rubrica)
{
int i;
for(i = 0; i < MAX_ELEMENTI; i++)
{
if(rubrica->indiciUsati[i] == 0)
return i;
}
return -1;
}
//FUNZIONE INSERIMENTO
void InserisciElemento (struct _rubrica *rubrica)
{
int pos = TrovaPosizione(rubrica);
if(pos != -1)
{
printf("Inserisci nome:\t"); //inserimento dati
scanf(" %s",rubrica->elenco[rubrica->indiceCorrente].nome);
printf("Inserisci cognome:\t");
scanf(" %s",rubrica->elenco[rubrica->indiceCorrente].cognome);
printf("Inserisci il telefono:\t ");
scanf(" %s",rubrica->elenco[rubrica->indiceCorrente].telefono);
rubrica->indiciUsati[pos] = 1;
if(pos == rubrica->indiceCorrente)
rubrica->indiceCorrente++;
// posizione vuota coincide con elemento massimo
// se non coincide significa che ho usato una poszione
// prima occupato da un dato eliminato
}
else
{
printf("\nRubrica piena!!!\n");
}
}
int CercaElemento(struct _rubrica *rubrica, const char * telefono)
{
int i;
for(i = 0; i < rubrica->indiceCorrente; i++)
{
if((rubrica->indiciUsati[i]) != 0 && (!strcmp(rubrica->elenco[i].telefono,telefono)))
{
return i;
}
}
return -1;
}
int EliminaElemento (struct _rubrica *rubrica)
{
char telefono[MAX_LEN_PHONE] = {0};
int i = -1;
printf("Inserire il numero di telefono:\t");
scanf(" %s",telefono);
i = CercaElemento(rubrica,telefono);
if(i != -1)
{
rubrica->indiciUsati[i] = 0;
}
else
{
printf("L\'elemento non esiste.");
}
}
//FUNZIONE MODIFICA
int ModificaElemento (struct _rubrica *rubrica)
{
char telefono[MAX_LEN_PHONE] = {0};
int i = -1;
printf("\nNumero telefonico delcontatto da modificare? ");
scanf(" %s",telefono);
i = CercaElemento(rubrica,telefono);
if(i != -1)
{
printf("\nRiscrivi nome e cognome ");
scanf(" %s",rubrica->elenco[i].nome);
scanf(" %s",rubrica->elenco[i].cognome);
printf("Inserisci il telefono ");
scanf(" %s",rubrica->elenco[i].telefono);
}
else
{
printf("L\'elemento non esiste.");
}
}
//FUNZIONE STAMPA
void StampaElenco (struct _rubrica *rubrica)
{
int i;
for(i = 0; i < rubrica->indiceCorrente; i++)
{
if(rubrica->indiciUsati[i] == 1)
{
printf("%s %s : %s\n",rubrica->elenco[i].nome, rubrica->elenco[i].cognome,rubrica->elenco[i].telefono);
}
}
}
int main (void) //PROGRAMMA RUBRICA
{
struct _rubrica rubrica;
FILE *f;
int scelta = 0;
int i;
for(i = 0; i < MAX_ELEMENTI; i++)
rubrica.indiciUsati[i] = 0;
rubrica.indiceCorrente = 0;
if ((f = fopen( "rubrica.txt", "rb" )) != NULL )
{
LeggiFile(f,&rubrica);
fclose(f);
}
printf("RUBRICA TELEFONICA\n");
while (scelta!=5){
printf("\nMenu\':\n1)Inserisci Contatto\n2)Elimina Contatto\n3)Modifica Contatto\n4)Stampa Rubrica\n5)Esci\n");
printf("Scelta: ");
scanf(" %d",&scelta);
switch(scelta)
{
case 1: InserisciElemento(&rubrica); break;
case 2: EliminaElemento(&rubrica); break;
case 3: ModificaElemento(&rubrica); break;
case 4: StampaElenco(&rubrica); break;
case 5:
{
if ((f = fopen( "rubrica.txt", "w+b" )) != NULL )
{
ScriviFile(f,&rubrica);
fclose(f);
}
printf("Chiusura programma in corso...");
printf("\nTerminato");
}
break;
}
}
}