Completare il seguente Corredandolo delle operazioni di cancellazione di un record e di modifica di un record. Dopo acer collaudato il programma, apportare le eventuali ulteriori modifiche che si ritengono opportune.
Utilizzare l'indirizzo e-mail per allegare il programma completo, oppure per chiedere suggerimenti.
#include <cstdlib> #include <iostream> #include <conio.h> using namespace std; FILE *fh; struct Persona { char Nome[20]; char tel[10]; } Amico; char nomeFile[] = "Rubrica.txt"; void crea() { fh = fopen( nomeFile, "wb"); if( fh == NULL ) perror( "Operazione di creazione file non riuscita\n"); else { printf("Creato file.\n"); fclose( fh ); } } void apri(){ fh = fopen( nomeFile, "rb+"); if(fh == NULL ) perror("Apertura file non riuscita\n"); else printf( "File pronto per lettura / scrittura\n" ); } void inserisci(struct Persona *Record){ if (fwrite(Record, sizeof(Persona), 1, fh) != 1) printf("\nErrore di scrittura nel file"); } int cerca(char *p){ int trovato=0; if (fh==NULL) apri(); printf("\n\rcerco %s", p); fseek(fh, 0L, SEEK_SET); while (!feof(fh)){ fread(Amico.Nome, 1, sizeof(Persona), fh); if (!strcmp(p, Amico.Nome)) { return (trovato=1); } } return 0; } int main(int argc, char *argv[]) { char ch, tmp[20], NrRec; do { printf("\nScegli l'operazione\n"); printf("1 - Crea Nuovo File\n"); printf("2 - Apri File\n"); printf("3 - Aggiungi dati\n"); printf("4 - Cancella dati\n"); printf("5 - Leggi tutto\n"); printf("6 - Cerca\n"); printf("7 - Modifica record\n"); printf("9 - Fine\n"); ch=getch(); switch(ch){ case '1': printf("\nCreazione file\n"); crea(); break; case '2': printf("\nApertura File\n"); apri(); break; case '3': if (fh==NULL) apri(); fseek(fh, 0L, SEEK_END); printf("\nAggiunta dati\n"); printf("\nInserisci il nome: "); gets(Amico.Nome); printf("\nInserisci il numero di telefono"); gets(Amico.tel); printf("\n\r%s %s",Amico.Nome, Amico.tel); inserisci(&Amico); break; case '4': //(l'operazione non è trattata) printf("\nEliminazione record"); /* Inserire le operazioni per eliminare un record Si suggerisce di scegliere un codice per marcare il record come "cancellato". Di conseguenza si potranno trattare i casi: 1) ripristina record, 2) sovrascrivi record al prossimo inserimento 3) compatta il file per eliminare definitivamente il record. Si descrive il procedimento per eliminare definitivamente il record, scambiandolo con l'ultimo. Notare che la dimensione del file non cambia. Leggere l'ultimo record; Marcare il primo campo dell'ultimo record con il carattere '\0' Usare il numero del record (ottenuto da una delle due funzioni "Cerca" o "leggi tutto") per posizionarsi sul record da eliminare, scrivere il record che occupava l'ultima posizione. */ break; case '5': if (fseek(fh, 0L, SEEK_SET)) { printf("\nFile non aperto"); break; } NrRec = 0; printf("\nLettura di tutto l'archivio"); while(!feof(fh)){ int n = fread(&Amico, 1, sizeof(Persona), fh); if (n>0) printf("\n\r%d: %s %s", ++NrRec, Amico.Nome, Amico.tel); } break; case '6': printf("\nRicerca Record"); printf("\n\rChi cerchi?"); gets(tmp); if (!cerca(tmp)) printf("non trovato"); NrRec = ftell(fh) / sizeof(Persona); printf("\n\r%d: %s %s", NrRec, Amico.Nome, Amico.tel); break; case '7': //(l'operazione non è trattata) printf("\nModifica record"); /* Inserire le operazioni per modificare un record. il record potrebbe essere modificato in tutti i suoi campi o solo in alcuni campi. Si suggerisce di usare il numero del record, ottenuto da una delle due funzioni ("Cerca" o "Leggi tutto") per posizionarsi sul record, leggerlo, stampare i campi e, per ciascuno di essi, leggere il nuovo valore. Riposizionarsi all'inizio del record e scrivere i nuovi valori dei campi */ break; case '9': if (fh!=NULL) fclose(fh); } } while(ch!='9'); return EXIT_SUCCESS; }