Programmi C / C++ - prof. Claudio Maccherani - Perugia - 2008
Gestione Archivio RANDOM (ad accesso diretto)
/* Gestione file RANDOM/DIRETTO, Dev-C++, prof.Claudio Maccherani, 2008 il file "FileRnd.dat" contiene 'studenti' con record così strutturati: +-----------+------+-------+--------+---------+-------+-------+-------+ | matricola | nome | sesso | classe | sezione | corso | tasse | città | +-----------+------+-------+--------+---------+-------+-------+-------+ */ #include
#include
#include
#include
struct studente { int matr; // definisce la struttura 'studente' char nome[31]; // 30 caratteri char sex; int classe; char sez; char corso[3]; // 2 caratteri int tasse; char citta[21]; // 20 caratteri }; typedef struct studente recstud; // definisce il tipo 'recstud' recstud alu; // definisce 'alu' (record di appoggio) di tipo 'recstud' FILE *fp; // fp è il "file pointer" che conterrà il descrittore del file const int N = 21; // numero di record dell'archivio (da 0 a 20!) void creazione(); // creazione/azzeramento archivio void registrazione(); // scrive un record nel file void elenco(); // elenco studenti void ricerca(); // ricerca di uno studente int main() { // programma principale ------------------------------------------ int scelta; do { system("cls"); scelta = -1; cout<<"Gestione file STUDENTI 'random' \n"; cout<<"1 - Registrazione record\n"; cout<<"2 - Elenco record\n"; cout<<"3 - Ricerca record\n"; cout<<"9 - Creazione file\n"; cout<<" scegli (0=fine) "; cin>>scelta; switch (scelta) { case 1: { registrazione(); break; } case 2: { elenco(); break; } case 3: { ricerca(); break; } case 9: { creazione(); break; } } } while (scelta!= 0); return 0; } void creazione() {// creazione/azzeramento archivio int r, rr, pos; system("cls"); cout<<"Creazione / azzeramento archivio\n"; fp = fopen("FileRnd.dat", "wb"); // file aperto in "wb": scrittura // si azzerano i campi del record alu.matr=0;strcpy(alu.nome," ");alu.sex=' ';alu.classe=0; alu.sez=' ';strcpy(alu.corso," ");alu.tasse=0;strcpy(alu.citta," "); for (r=1;r
>r; // numero record if (r >= 1 && r <= N) { // controlla se il numero record è ammissibile pos = sizeof(recstud) * r; // calcola la posizione del record 'r' rr = fseek(fp,pos,SEEK_SET); // si posiziona sul record fread(&alu,sizeof(recstud),1,fp); // lo legge if (alu.matr > 0) // se il record è occupato, lo segnala cout<<"record "<
>alu.matr; cout<<"Nome "; gets(alu.nome); cout<<"Sesso "; cin>>alu.sex; cout<<"Classe "; cin>>alu.classe; cout<<"Sezione "; cin>>alu.sez; cout<<"Corso "; scanf("%s",alu.corso); cout<<"Tasse "; cin>>alu.tasse; cout<<"Citta' "; scanf("%s",alu.citta); rr = fseek(fp,pos,SEEK_SET); // si riposiziona sul record 'r' fwrite(&alu,sizeof(recstud),1,fp); // memorizza il nuovo record cout<<"record "<
0) // visualizza solo i record non vuoti cout<
>matrx; fp = fopen("FileRnd.dat", "rb"); // apre il file in modalità "rb": lettura for (int r=1; r