Programma gestione

di il
25 risposte

25 Risposte - Pagina 2

  • Re: Programma gestione

    Ho capito cosa intendi! Potresti gentilmente farmi un esempio concreto? in cui memorizzo una proprietà alla volta e leggo una proprietà alla volta?
    dovrei ad esempio fare fread(&uten.set_nome,sizeof(char*20),1,fp) ? e stessa cosa per l'fwrite? mettendoci &uten.get_nome?
  • Re: Programma gestione

    Ci hai quasi azzeccato:
    
    fread(&uten[i].set_nome,sizeof(char),20,fp);
    
    ora prova a pensarla cosi, tu hai una clase PERSONA, perchè non implementi i metodi ::load(FILE*f) e ::save(FILE* f)
    Che salvano e leggono dal file le proprietà di un solo utente, cosi semplifichi di molto le cose...magari il primo dato è il count di tutti gli utenti salvati. avrai quindi (in forma semplificata):
    
    #define MAX_UTENTI 100
    
    int count;
    utente utenti[MAX_UTENTI];
    ...
    fread(&count,sizeof(int),1,fp);
    for ( int i = 0; i < count; ++i )
    {
        utenti[i].load(fp);
    }
    ...
    
    poi lo adatti alle tue esigenze
  • Re: Programma gestione

    Il discorso è che a set nome per come l'ho definita ci devo passare un argomento..memorizzo in una variabile temp e poi inserisco? della serie:
    fread(&temp.....)
    a.set_nome_(temp); ?

    p.s.
    fwrite(&b.get_codice_libro(),sizeof(int),1,fp);
    mi dice error C2102: '&' richiede un l-value

    le altre fwrite con le stringhe funzionano correttamente..
  • Re: Programma gestione

    Implementa il metodo load e save dentro a persona, utenti o come diavolo si chiama, cosi accedi direttamente alle proprietà senza passare da get/set e non ti perdi.
  • Re: Programma gestione

    Grazie
  • Re: Programma gestione

    Altra piccola cosa..fino a qualche ora fa funzionava -.-'
    Da premettere che la stessa e identica cosa la faccio per un'altra class e funziona..
    il mio obbiettivo è quello di conoscere quanti utenti sono presenti nel file..bene ho creato la seguente funzione
    int individua_utenti()
    {
    	int dim,p;
    	FILE *fp;
    	if((fp=fopen("Utenti.txt","rb"))!=NULL)
    	{
    		fseek(fp,0,2);
    		dim=ftell(fp);
    		cout<<"dimensione: "<<dim<<endl;
    		cout<<"dimensione classe: "<<sizeof(class utente);
    		p=(dim/sizeof(class utente));
    		fclose(fp);
    		return p;
    	}
    	else
    		return 0;
    }
    la mia class utente è derivata di persona ed è così definita (copio giusto le variabili):
    class utente:public persona
    {
    	int codice_utente;
    	long long recapito_telefonico;
    	char citta_residenza[20];
    public: ecc
    
    in persona sono presenti: char nome_utente[20], char cognome_utente[20] e int eta;
    ora...mettendo un pò di cout qui e lì per verifare la dimensione ottengo dimensione file 86 e dimensione classe 96 (se vado ad inserire un solo utente!)

    p.s.
    cout<<"dimensione: "<<dim<<endl;
          cout<<"dimensione classe: "<<sizeof(class utente);
    che sono presenti nel primo codice le ho messe per verifare le dimensioni effettive

    Questa che ora riporto è la funzione della classe per il caricamento su file
    void utente::carica_utenti_su_file()
    {
    	FILE *fp;
    	fp=fopen("Utenti.txt","ab");
    	fwrite(&nome_utente,sizeof(char),20,fp);
    	fwrite(&cognome_utente,sizeof(char),20,fp);
    	fwrite(&eta,sizeof(int),1,fp);
    	fwrite(&codice_utente,sizeof(int),1,fp);
    	fwrite(&recapito_telefonico,sizeof(long),2,fp);
    	fwrite(&citta_residenza,sizeof(char),20,fp);
    	fclose(fp);
    }
  • Re: Programma gestione

    Recapito telefonico salvi 2 invece deve essere 1 ovvero salvi una variabile long.

    Non puoi calcolare il numero degli oggetti in base alla dimensione della classe, al massimo puoi creare una proprietà di sola lettura che restituisca quanto occupa su disco, tale proprietà restituirà la somma della dimensione di ogni proprietà.
  • Re: Programma gestione

    Dimenticato il metodo è meglio chiamarli ::carica(FILE* fp)
    nel tuo caso specifico cariche resti sempre e solo il primo utente
  • Re: Programma gestione

    Sisi per quest'ultimo fatto ho fatto altre 2 funzoni..in una come mi hai consigliato ho passato il puntatore a file, nell'altra ho usato fseek per spostare il puntatore! in quella che ho riportato qui non è necessario, in quanto mi serve solo per scrivere su file e con la modalità "ab" scrivo uno in coda all'altro..
    cmq dicevo, ho provato anche mettendo 1 ma risulta sempre sbagliato il calcolo!


    "Non puoi calcolare il numero degli oggetti in base alla dimensione della classe, al massimo puoi creare una proprietà di sola lettura che restituisca quanto occupa su disco, tale proprietà restituirà la somma della dimensione di ogni proprietà"

    io ho spostato il puntatore alla fine e ho letto la dimensione del file! dopo di che ho diviso la dimensione del file per lo spazio occupato da una class(somma di ogni proprietà)... in questo modo non dovrei avere il numero di class (pacchetto di proprietà) presenti nel file? con la class libri questo ragionamento funziona, tant'è che aggiungendo o togliendo proprietà il calcolo coincide sempre..
    (mi sto riferendo al caso in cui naturalmente in un file siano riportate tutte le proprietà di class identiche)

    oppure semplicemente posso mettere: sizeof( char *20 + int *10) ad esempio?
  • Re: Programma gestione

    Sizeof(classe) restituisce la dimensione che occupa la classe compresi metodi e quant'altro.
    cerco di farti un esempio semplice, non rispecchia la realtà ma ci va vicino.
    Quando dichiari una classe a grandi linee il compilatore fa questo:
    
    struct MIACLASSE{
         int proprietaA;
         int proprietaB;
         int (*metodoA)(int);
         int (*metodoB)();
    };
    
    Ora cosa accade se fai sizeof(MIACLASSE)?
    TI ritorna 16 bytes e non 8 come vorremmo perchè calcola anche la dimensione dei metodi.
    Nella realtà le cose sono giusto un pelo più complesse e molto probabilmente la sizeof non tornerebbe nemmeno 16, ma questa era una semplificazione di tutto il meccanismo degli oggetti per facilitarti la comprensione
  • Re: Programma gestione

    Ti rigranzio davvero, sei sempre molto chiaro! Ho pensato di risolvere in questo modo:
    p=(dim/(sizeof(char)*60+sizeof(long)+sizeof(int)*2));
Devi accedere o registrarti per scrivere nel forum
25 risposte