PDA

Visualizza la versione completa : [C] Salvare e leggere dati anagrafici


palladino.al
07-08-2019, 20:54
ciao ragazzi, devo fare un "esercizio" che generato N di dati anagrafici li devo salvare in un file binario e successivamente devo leggere il contenuto del file e stamparlo a video... ho provato ma non riesco





#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <ctype.h>


#define N 5


typedef struct {
int giorno;
int mese;
int anno;
} data ;


typedef struct {
int giorno;
int mese;
int anno;
} data1 ;




typedef struct {
int id;
char nome_utente[50];
char nome[50+1]; // account NOME
char cognome[50+1]; // account first name
int sesso;
data datanascita;
data1 data_iscrizione;
char password[10+1];
char email[60+1];
}utente;
typedef enum {false, true} bool;


// prototypes
void insert(FILE *pf); //prototipo funzione
void print(FILE *pf); //prototipo funzione




int main(void)
{
setbuf(stdout,NULL);
setbuf(stdout,NULL);
utente account;


FILE *cfPtr; // studenti.dat file pointer


// fopen opens the file; exits if file cannot be opened
if ((cfPtr = fopen("studenti.dat", "rb")) == NULL) {
puts("File could not be opened.");
}
else {


unsigned int choice; // user's choice


// enable user to specify action
char strScelta[2];
char sceltaSicurezza[2];
int scelta = 0;
int sottosceltaint = 0;




bool esci = false; //true se l'utente sceglie opzione 0 per uscire dal programma
bool valore_trovato = true;
bool esci_aggiornamento_voto = false;








while(!esci){
printf("\n");


printf("1) gestione utenti DATI\n");
printf("2) ____\n");
printf("3)____\n");
printf("4) ____\n");
printf("5) ____\n");
printf("Opzione desiderata: ");
scanf("%s", strScelta);
while (strcmp(strScelta,"1") && strcmp(strScelta,"2") && strcmp(strScelta,"3") && strcmp(strScelta,"4") && strcmp(strScelta,"5")){
printf("Hai effettuato una scelta errata\n ");
printf("Effettua una scelta: ");
scanf("%s", strScelta);
//ripete fin quando l'utente non inserisce una scelta valida
}
while (strcmp(strScelta,"1") && strcmp(strScelta,"2")){
printf("Attenzione! hai inserito una scelta non valita\n ");
printf("Opzione desiderata: ");
scanf("%s", strScelta);
}


//conversione scelta in int
scelta = (int) strtol(strScelta,(char **)NULL,0);


switch(scelta){


case 1:


printf("CARICAMENTO DATI\n");


printf("1) generazione dati\n");
printf("2) visualizzazione dati\n");


printf("Effettua una scelta: ");
scanf("%s", strScelta);
while (strcmp(strScelta,"1") && strcmp(strScelta,"2")){
printf("Hai effettuato una scelta errata\n ");
printf("Effettua una scelta: ");
scanf("%s", strScelta);
}


//ripete fin quando l'utente non inserisce una scelta valida


if(strcmp(strScelta,"1") == 0){
insert(cfPtr);
printf("\n");
} else if(strcmp(strScelta,"2") == 0){
print(cfPtr);
printf("\n");
}
scelta = (int) strtol(strScelta,(char **)NULL,0);
break;


case 2:


break;


case 3:


break;


case 4:


break;


case 5:
printf("\ncaso0\n");
esci = true;
break;


}
}








fclose(cfPtr); // fclose closes the file
}
}






void insert(FILE *pfile){
setvbuf(stdout, NULL, _IONBF, 0);
FILE *fp;
int i;
utente account[N];


if((fp=fopen("utenti.txt", "wb"))==NULL) {
printf("Errore nell'apertura del file'");
exit(1);
}
int indice=0;
int seed = (time(NULL));
srand(seed);
// randomizzo nomi, cognomi, indirizzo e email
char* nomi [] = {"ALESSANDRO", "GIACOMO", "ALESSIO", "ANTONIO", "CARLO", "FABIO",
"ALESSANDRA", "GIACOMA","ALESSIA", "ANTONIA", "CARLA", "FABIA"};
char* cognomi [] = {"ROSSI", "BIANCHI", "NEGRO", "RIZZI", "CAMPESE", "IODICE",
"ROSSIA", "BIANCHIA", "NEGROA", "RIZZIA", "CAMPESEA", "IODICEA"};
char* simboli [] = {".", "_"};


char* email[] = {"@gmail.com", "@gmail.it", "@hotmail.it", "@hotmail.it", "@aruba.it", "@aruba.com", "@libero.it"};
// RANDOM NOMI
for(i=0;i<N;i++) {
//determino il codice univovo <-- DA CAMBIARE
account[i].id = i+1;
//determino in nome radom
indice = 0;
indice = rand () % 12;


strcpy(account[i].nome, nomi[indice]);
int indice_sesso= indice+1;


/*if (indice_sesso > 6){
account[i].sesso = 0;
}else
account[i].sesso = 1;*/
//determino il cognome random
indice = 0;
indice = rand () % 12;
strcpy(account[i].cognome, cognomi[indice]);
//determino il sesso delle persone


// data nascita


char stringa_mese[2];
account[i].datanascita.anno = rand()% (40) + 1969;


// Mese nascita
account[i].datanascita.mese = rand () % (12 - 1) + 1;
itoa (account[i].datanascita.mese, stringa_mese, 10);




// Giorno nascita


if (account[i].datanascita.mese==2 && account[i].datanascita.anno%400==0 || (account[i].datanascita.anno%4==0 &&!(account[i].datanascita.anno%100==0))){
account[i].datanascita.giorno = rand () % (29 - 01) + 01;
}
else if (account[i].datanascita.mese==2){
account[i].datanascita.giorno = rand () % (28 - 01) + 01;
}
else if (account[i].datanascita.mese==1 || account[i].datanascita.mese==3 || account[i].datanascita.mese==5 || account[i].datanascita.mese==7 || account[i].datanascita.mese==8 || account[i].datanascita.mese==10){
account[i].datanascita.giorno = rand () % (31 - 01) + 01;
}
else {
account[i].datanascita.giorno = rand () % (30 - 01) + 01;
}
// generazione nome utente
char string[50] = {""};
char string1[4+1] = {""};


int anno = account[i].datanascita.anno;
itoa (anno, string1, 10);


strcpy(string, account[i].nome); // copio il nome
indice = 0;
strcat(string, "_");
strcat(string, account[i].cognome); // concateno il cognome
strcat(string, ".");
strcat(string, string1);


// data iscrizione


// char stringa_mese[2];
account[i].data_iscrizione.anno = rand()% (15) + 2005;


// Mese nascita
account[i].data_iscrizione.mese = rand () % (12 - 1) + 1;
itoa (account[i].data_iscrizione.mese, stringa_mese, 10);




// Giorno nascita


if (account[i].data_iscrizione.mese==2 && account[i].data_iscrizione.anno%400==0 || (account[i].data_iscrizione.anno%4==0 &&!(account[i].data_iscrizione.anno%100==0))){
account[i].data_iscrizione.giorno = rand () % (29 - 01) + 01;
}
else if (account[i].data_iscrizione.mese==2){
account[i].data_iscrizione.giorno = rand () % (28 - 01) + 01;
}
else if (account[i].data_iscrizione.mese==1 || account[i].data_iscrizione.mese==3 || account[i].data_iscrizione.mese==5 || account[i].data_iscrizione.mese==7 || account[i].data_iscrizione.mese==8 || account[i].data_iscrizione.mese==10){
account[i].data_iscrizione.giorno = rand () % (31 - 01) + 01;
}
else {
account[i].data_iscrizione.giorno = rand () % (30 - 01) + 01;
}














/*for (int j=0; j<4;j++){


/* }*/
strcpy(account[i].nome_utente, string); // copio string all'interno della stringa 'email'




//generazione password


//generazione email


indice = 0;
indice = rand () % 10;
strcat(account[i].email, account[i].nome);
strcat(account[i].email, account[i].cognome);
strcat(account[i].email, email[indice]);


fflush(stdin);




}
fprintf(fp, "%-6s%-15s%-15s%-20s%-32s\n","#","NOME","COGNOME","DATA DI NASCITA","NOME UTENTE");
for (i=0;i<N;i++){
fprintf(fp,"%4d) %-15s%-15s\n",account[i].id, account[i].nome, account[i].cognome);
// fprintf(fp,"%-15s", account[i].nome);
//fprintf(fp, "%-15s", account[i].cognome);
//fprintf(fp,"%-6s%s \t %s\n", account[i].id, account[i].nome, account[i].cognome);
}
printf("%-6s%-15s%-15s%-20s%-32s\n","#","NOME","COGNOME","DATA DI NASCITA","NOME UTENTE");
for(i=0;i<N;i++) {


// stampo a video i risultati del caricamento in forma tabellare
if (account[i].id <= 9){
printf("000%d) ",account[i].id);


} else if (account[i].id <= 99){
printf("00%d) " ,account[i].id);
} else if (account[i].id <= 999){
printf("0%d) " ,account[i].id);
}else if (account[i].id <= 9999){
printf("%d) " ,account[i].id);
}
// printf("%5d) ",account[i].id);
printf("%-15s", account[i].nome);
printf("%-15s", account[i].cognome);
// printf("%15d", stringa1);
// printf("\t\t| #: %d\n", account[i].id);
// printf("\t\t| Nome: %s\n", account[i].nome);
// printf("\t\t| Cognome: %s\n", account[i].cognome);


// per una migliore formattazione se il giorno o il mese contengono un num < 10 aggiungo lo 0
//data nascita
if (account[i].datanascita.giorno < 10) {
printf("0%d-", account[i].datanascita.giorno);
} else {
printf("%d-", account[i].datanascita.giorno);
}
if (account[i].datanascita.mese < 10) {
printf("0%d-", account[i].datanascita.mese);
} else {
printf("%d-", account[i].datanascita.mese);
}
printf("%d%-10s", account[i].datanascita.anno,"");
//data iscrizione


if (account[i].data_iscrizione.giorno < 10) {
printf("0%d-", account[i].data_iscrizione.giorno);
} else {
printf("%d-", account[i].data_iscrizione.giorno);
}
if (account[i].data_iscrizione.mese < 10) {
printf("0%d-", account[i].data_iscrizione.mese);
} else {
printf("%d-", account[i].data_iscrizione.mese);
}
printf("%d%-10s", account[i].data_iscrizione.anno,"");
printf("%-18s", account[i].nome_utente);






//printf("%-18s", account[i].nome_utente);


// printf("%-30s", account[i].email);
// printf("%-20s", tolower([i].nome_utente);
//printf("%-18s", account[i].nome_utente);
// printf("\t\t| NOME UTENTE: %s\n", account[i].email);
// printf("\t\t| PASSWORD: %s\n", account[i].password);
// printf("\t\t| SESSO: %d\n", account[i].sesso);


printf("\n");


}
}


void print(FILE *pfile){
if ((pfile = fopen("studenti.dat", "rb")) == NULL) {
puts("File could not be opened.");
}
else {
while (!feof(pfile)) {
// create studente with default information
utente account[N];


int result = fread(&account, sizeof(utente), 1, pfile);
printf("result: %d\n", result);
// display record


for(int i=0;i<N;i++) {
printf("\nMatricola: %d\n",account[i].id);




}


}


printf("%-6s%-15s%-15s%-20s%-32s\n","#","NOME","COGNOME","DATA DI NASCITA","NOME UTENTE");




}
}

Loading