Visualizzazione dei risultati da 1 a 4 su 4

Discussione: [c++] salvare su file

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    35

    [c++] salvare su file

    Salve a tutti, prima di scrivere o cercato una soluzione fra le varie discussioni ma non sono riuscito ancora a capire come risolvere il mio problema...

    Ho esigenza di salvare su un file dei dati relativi a dei dipendenti, e in seguito poterli gestire (cancellare, visualizzare, ecc...)

    Di seguito riporto il codice che ho creato che però mi da qualche problema, non sò se ho fatto bene o se ci sono dei modi per scriverlo più facilmente.

    Utilizzo Visual C++ 2008 Express Edition come compilatore.


    codice:
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    void carica();
    void cancella();
    void visualizza();
    
    struct dipendente{	
    					int matricola;
    					string nome;
    					string cognome;
    					int settore;
    
    					};
    
    typedef struct dipendente dip;
    dip database;
    
    FILE *azienda;
    
    void main(){
    
    	int scelta;
    
    cout<<"Database gestione dipendenti" << endl << "---------------------------------" << endl << endl << endl;
    
    cout<< "MENU\n1) Inserisci dip\n2) Cancella dip\n3) Visualizza elenco dip\n0) Uscita";
    
    do{
    	cout<< "\n\n\nscelta --> ";
    	cin>> scelta;
    
    	switch(scelta){
    
    		case 1: 
    				azienda = fopen("database.dat","wb");	
    				carica();
    				fclose(azienda);
    				break;
    
    		case 2: 
    				azienda = fopen("database.dat","wb");
    				if (azienda != NULL)cancella();
    				fclose(azienda);
    				break;
    
    		case 3: 
    				azienda = fopen("database.dat","rb");
    				visualizza();
    				fclose(azienda);
    				break;
    
    		case 0: 
    				break;
    
    		default: 
    				cout<<"\n\nError";
    				break;
    
    }
        }while(!scelta);
    
    
    }
    
    
    void carica(){
    
    char selezione;
    
    fwrite(&database, sizeof(struct dipendente), 1, azienda);
    
    cout<< "\n\n\nCaricamento dati dipendente\n\n\nmatricola:  ";
    cin>> database.matricola;
    cout<< "\nnome:  ";
    cin>> database.nome;
    getline(cin, database.nome);
    cout<<"\ncognome:  ";
    cin>> database.cognome;
    getline(cin, database.cognome);
    cout<< "\nsettore:  ";
    cin>> database.settore;
    
    cout<< "\n\n\n\ninserire un nuovo record? <s/n>";
    cin>> selezione;
    
    if(selezione == 's') {carica();}
    
    return;
    }
    
    
    
    
    
    void cancella(){
    
    }
    
    
    
    void visualizza(){
    
    fread(&database, sizeof(struct dipendente), 1, azienda);
    
    cout<<"Visualizzazioe elenco dipendenti\n----------------------------";
    
    while(!feof(azienda)){
    
    cout<< "\n\n\n\nmatricola:  " << database.matricola;
    cout<< "\nnome:  " << database.nome;
    cout<<"\ncognome:  " << database.cognome;
    cout<< "\nsettore:  " << database.settore;
    fread(&database, sizeof(struct dipendente), 1, azienda);
    
    }
    
    return;
    
    }
    Sto imparando ad usare il C++, mi servirebbero anche dei suggerimenti su come cancellare i record, infatti se avete notato la funzione è vuota...

    Spero di essere stato il più chiaro possibile e vi ringrazio anticipatamente, attendo vostri suggerimenti.

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    35
    a proposito uno dei problemi è che se inserisco i dati di un dipendente e poi rispondo 'n' (NO) alla richiesta di "inserire un nuovo record?" il programma mi si chiuse non rimandandomi all'inserimento di una delle funzioni del menù....


    grazie

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Scusa ma (tanto per cominciare) nella funzione carica() non ti pare che la scrittura debba avvenire dopo l'inserimento dei dati da tastiera? Tu lo fai all'inizio della funzione invece...

    E comunque cerca di evitare come la peste le variabili globali... quella struttura "database" può essere dichiarata localmente alla funzione carica() e non vedo la necessità di ricorrere ad una dichiarazione globale.
    every day above ground is a good one

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    35
    Ok ho spostato la 'fwrite' dopo l'inserimento dei vari dati e probabilmente adesso salva, dico probabilmente perchè purtroppo non riesco a visualizzare i dati immessi, la funzione visualizza è giusta???...Di seguito riporto le funzioni riscritte e l'output che mi dà nel momento in cui seleziono la funzione 3 cioè visualizza i dipendenti salvati...


    codice:
    void carica(){
    
    char selezione;
    
    
    
    cout<< "\n\n\nCaricamento dati dipendente\n\n\nmatricola:  ";
    cin>> database.matricola;
    cout<< "\nnome:  ";
    cin>> database.nome;
    getline(cin, database.nome);
    cout<<"\ncognome:  ";
    cin>> database.cognome;
    getline(cin, database.cognome);
    cout<< "\nsettore:  ";
    cin>> database.settore;
    
    fwrite(&database, sizeof(struct dipendente), 1, azienda);
    
    cout<< "\n\n\n\ninserire un nuovo record? <s/n>\n";
    cin>> selezione;
    
    if(selezione == 's') carica();
    
    return;
    }
    
    
    
    
    
    void cancella(){
    
    }
    
    
    
    void visualizza(){
    
    fread(&database, sizeof(struct dipendente), 1, azienda);
    
    cout<<"\n\n\nVisualizzazioe elenco dipendenti\n----------------------------";
    
    while(!feof(azienda)){
    
    
    cout<< "\n\n\n\nmatricola:  " << database.matricola;
    cout<< "\nnome:  " << database.nome;
    cout<<"\ncognome:  " << database.cognome;
    cout<< "\nsettore:  " << database.settore;
    fread(&database, sizeof(struct dipendente), 1, azienda);
    
    }
    getch();
    return;
    
    }
    Nel caso inserisco dei dati generici es. matricola: 1, nome: valentino, cognome: rossi, settore: 2... L'output della funzione visualizza() è:

    Visualizzazione elenco dipendenti
    --------------------------------

    matricola: 1
    nome:
    cognome:
    settore: 2
    Non mi salva i nomi, perchè???Sapete darmi una spiegazione?




    E comunque cerca di evitare come la peste le variabili globali... quella struttura "database" può essere dichiarata localmente alla funzione carica() e non vedo la necessità di ricorrere ad una dichiarazione globale.
    Riguardo l'utilizzo delle variabili globali d'accordo ho provato a spostare il tutto in carica() ma poi 'database' non viene ovviamente riconosciuto in visualizza()...Comunque non è questo che mi preme ora...

    Inoltre mi servirebbero consigli su come cancellare, non codice, ma almeno la spiegazione di un metodo possibile....


    a proposito uno dei problemi è che se inserisco i dati di un dipendente e poi rispondo 'n' (NO) alla richiesta di "inserire un nuovo record?" il programma mi si chiuse non rimandandomi all'inserimento di una delle funzioni del menù....
    Riguardo al fatto che dopo l'inserimento dei dati il programma si chiudesse, ho trovato l'errore ed era nello scrivere while(!scelta) invece che while(scelta) avevo prarticamente fatto il contrario di ciò che mi serviva, lo scrivo semplicemente nel caso servisse a qualcun'altro.

    Attendo risposte e vi ringrazio dell'aiuto.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.