PDA

Visualizza la versione completa : Rubrica in C


SteelBoy
12-06-2017, 10:47
Ragazzi come programma devo realizzare una rubrica in c che mi permette di aggiungere un contatto,eliminarlo,ricercarlo e di stampare l'intera rubrica.. e fin qui ci siamo, ho risolto il tutto utilizzando uno struct al cui interno ci sono nome, cognome, città e telefono, ecc...
ora però devo integrare la funzione di salvataggio e lettura da/su file!
per il salvataggio ho ideato questo codice che funziona in quanto stampa su file i miei contatti

case 5://salvataggio su file
FILE *fp;//puntatore
fp = fopen("rubrica.dat", "a+");
for (v=0;v<utentimemorizzati;v++)
{
fprintf(fp,"Nome: %s \n",rubrica[v].nome);
fprintf(fp,"Cognome: %s \n",rubrica[v].cognome);
fprintf(fp,"Citta: %s \n",rubrica[v].citta);
fprintf(fp,"Telefono: % s\n",rubrica[v].telefono);
}
fclose(fp);
printf("Rubrica salvata!\n");
break;

in lettura invece non saprei come leggere i contatti cosi come stanno. suggerimenti? :)

oregon
12-06-2017, 11:11
Con una fopen e tante fscanf ...

SteelBoy
12-06-2017, 11:18
Ho provato ad utilizzare lo stesso costrutto del salvataggio su file , ma non legge i dati, sarò io che sbaglio :D
una volta aperto il file ho fatto 4 fscanf così:
fscanf(fp1,"%s",rubrica[v].nome), stessa cosa con congnome,citta e telefono.. ma andando poi a stampare la rubrica non esce alcuna voce

oregon
12-06-2017, 11:31
Detta così non si può dire molto ... mostra il codice usato e assicurati che stai effettivamente leggendo i dati usando breakpoint e debugging.

SteelBoy
12-06-2017, 11:38
Avevo semplicemente utilizzato la falsa riga della scrittura su file.. ma a questo punto dubito si possa prendere questa strada


case 6://lettura del file

FILE *fp1;//puntatore
fp1 = fopen("rubrica.dat", "r");//Lettura file.
while(!feof(fp1)) //finchè non finisce il file
{
fscanf(fp1,"%s",rubrica[v].nome);
fscanf(fp1,"%s",rubrica[v].cognome);
fscanf(fp1,"%s",rubrica[v].citta);
fscanf(fp1,"%s",rubrica[v].telefono);
v++;
}
fclose(fp1);
printf("Rubrica letta!\n");
break;

oregon
12-06-2017, 11:56
Ma la variabile v da dove parte?

SteelBoy
12-06-2017, 12:00
v è la variabile generale che ho utilizzato...


case 1: //aggiunti contatto
printf("Inserire il nome:\n");
scanf("%s",rubrica[v].nome);
printf("Inserire il cognome:\n");
scanf("%s",rubrica[v].cognome);
printf("Inserire la citta:\n");
scanf("%s",rubrica[v].citta);
printf("Inserire numero di telefono:\n");
scanf("%s",rubrica[v].telefono);
utentimemorizzati++;
v++;
//Verifica se i dati sono validi
if ( utentimemorizzati == DIM )
{
puts("ERRORE: rubrica piena") ;
break ;
}
break;

Ad esempio questo è l'inserimento del contatto, invece di utilizzare la variabile i, ho utilizzato la v.

queste sono tutte le mie variabili


char nome[DIM],cognome[DIM],telefono[DIM],citta[DIM];
int scelta=0;//comando switch
int utentimemorizzati=0;
int v=0;//generale nelle stringhe
int trovato=0;//ricerca
int j=0;//cancellare
int comando;//comando finale
persona rubrica[500]; //stringa con tutti gli struct
int pos;//posizione int ricerca

oregon
12-06-2017, 12:48
Non mi hai capito ... quando rileggi, v deve partire da 0. Ma tu non assegni 0 a v

SteelBoy
12-06-2017, 13:05
Hai ragione scusa non avevo capito :)
comunque nonostante la correzione il file non viene letto.
ho provato anche a modificare il la scrittura del file togliendo ,nome,cognome,telefono lasciando solo %s, pensando che era quello che il programma non riusciva a leggere, ma nulla

oregon
12-06-2017, 13:11
Intanto quando scrivi devi usare semplicemente

"%s\n"

nella fprintf per memorizzare solo i dati e non tutto il resto.

Poi assicurati che il file contenga i dati che hai scritto, aprendolo con notepad.
Vedi tutti i dati della rubrica?

Loading