Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Problema con la gestione file, programma libreria
Forum - C/C++ - Problema con la gestione file, programma libreria

Avatar
Iago90 (Normal User)
Newbie


Messaggi: 5
Iscritto: 27/07/2010

Segnala al moderatore
Postato alle 17:19
Martedì, 27/07/2010
Salve a tutti, è il mio primo messaggio in questo forum, volevo innanzitutto ringraziare tutti per il lavoro che svolgete che è di infinito aiuto per chi si affaccia al mondo della programmazione, e poi approfittare della vostra pazienza per sottoporre a voi menti esperte un problema che mi blocca da giorni.

Sto creando un programma per la gestione di una libreria ma ho incontrato un intoppo nella gestione dei file salvati.

Mi serve salvare l'intero oggetto "tessera" che contiene i dati del lettore, e poi poterlo ripescare dal file per modificarlo cancellarlo o semplicemente leggerlo.

Il codice è questo:
Codice sorgente - presumibilmente C/C++

  1. //C'è un menu, la scelta 1 è la scrittura dei record e la 2 la lettura dell'elenco
  2.  
  3.         if(scelta == '1'){
  4.                         ofstream write("Tessere", ios::app | ios::binary);
  5.                         do{
  6.                                 lettore.set_tessera();
  7.                                 write.write((char*)&lettore, sizeof(tessera));
  8.                                 cin.sync();
  9.                                 cout<< "Inserire nuova tessera? <s/n>: ";
  10.                                 cin>> risp;
  11.                         }while(risp != 'n');
  12.                         write.close();
  13.                 }
  14.  
  15.                 if(scelta == '2'){
  16.                         system("CLS");
  17.                         ifstream read("Tessere", ios::in | ios::binary);
  18.                         while(!read.eof()){
  19.                                
  20.                                 read.read((char*)&lettore, sizeof(tessera));
  21.                                 lettore.get_tessera();
  22.                         }
  23.                         read.close();
  24.                         system("pause");                         
  25.                 }
  26.  
  27. //Le due funzioni lettore.set_tessera() e lettore.get_tessera() le riporto qui di seguito
  28.  
  29. void tessera::set_tessera(){
  30.        
  31.         system("CLS");
  32.         cout<<"Creazione nuova tessera utente"<< endl<< endl;
  33.         cout<<"id lettore: ";
  34.         cin>> id;
  35.         cout<<"nome: ";
  36.         getline(cin, nome);
  37.         cout<<"cognome: ";
  38.         getline(cin, cognome);
  39.         cout<< "codice fiscale: ";
  40.         getline(cin, codfis);
  41.         cout<< "tel: ";
  42.         getline(cin, tel);
  43.         cout<< "indirizzo: ";
  44.         getline(cin, indirizzo);
  45.         cout<< "citta': ";
  46.         getline(cin, citta);
  47.         cout<< "n. documento di identita': ";
  48.         getline(cin, doc);
  49.         system("CLS");
  50.  
  51. }
  52.  
  53. void tessera::get_tessera(){
  54.  
  55.         cout<< "Visualizzazione tessera lettore"<<endl<<endl;
  56.         cout<< "id lettore: " << id << endl;
  57.         cout<< "nome: " << nome << endl;
  58.         cout<< "cognome: " << cognome << endl;
  59.         cout<< "codice fiscale: "<< codfis<< endl;
  60.         cout<< "indirizzo: " << indirizzo << endl;
  61.         cout<< "citta': " << citta << endl;
  62.         cout<< "tel.: " << tel << endl;
  63.         cout<< "n. documento di identita': " << doc << endl << endl;
  64. }
  65.  
  66. //Ovviamente fanno capo alla classe tessera:
  67.  
  68. class tessera {
  69.  
  70.         int id;
  71.         string nome;
  72.         string cognome;
  73.         string codfis;
  74.         string tel;
  75.         string indirizzo;
  76.         string citta;
  77.         string doc;
  78.  
  79. public:
  80.  
  81.         void set_tessera();
  82.         void get_tessera();
  83.         void modifica();
  84.         void elimina();
  85.  
  86. };



Sono divise in 3 file diversi questi pezzi di codice, ma comunque ben congiunti, non ci sono errori del compilatore.
Non so dove sia il problema, so solo che in output non mi mostra l'elenco delle tessere

Vi prego aiutatemi
Grazie in anticipo



Ultima modifica effettuata da Iago90 il 27/07/2010 alle 17:20
PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 695
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 17:47
Martedì, 27/07/2010
Salve:
in genere per salvare su file una variabile di tipo di dato qualsiasi bisogna fare in modo ( attraverso un cast ) che venga visto come un insieme di caratteri; piu' o meno cosi':

Codice sorgente - presumibilmente Plain Text

  1. fstream MainFile;
  2. Tessera Elem;
  3.  
  4. ...
  5.  
  6. MainFile.write(reinterpret_cast<unsigned char*>(&Elem),sizeof(Tessera));


Ultima modifica effettuata da gigisoft il 27/07/2010 alle 17:49


Le cose si fanno per bene o non si fanno affatto
PM Quote
Avatar
totipianurese (Member)
Pro


Messaggi: 168
Iscritto: 24/06/2008

Segnala al moderatore
Postato alle 18:37
Martedì, 27/07/2010
Ciao, se può essererti d'aiuto ho creato una libreria che permette di effettuare le operazioni piu semplici su file come: scrittura, lettura, cancellazione logica, canc.fisica, ricerca binaria, sequenziale ecc ecc.

la puoi scaricare qui, ti consiglio di leggere la documentazione.
http://www.pierotofy.it/pages/sorgenti/dettagli/18379-Clas ...

Saluti
Salvatore


The KING of the KING

My WebSite:http://www.infototi.altervista.org
PM Quote
Avatar
Iago90 (Normal User)
Newbie


Messaggi: 5
Iscritto: 27/07/2010

Segnala al moderatore
Postato alle 18:45
Martedì, 27/07/2010
Testo quotato

Postato originariamente da gigisoft:

Salve:
in genere per salvare su file una variabile di tipo di dato qualsiasi bisogna fare in modo ( attraverso un cast ) che venga visto come un insieme di caratteri; piu' o meno cosi':

Codice sorgente - presumibilmente Plain Text

  1. fstream MainFile;
  2. Tessera Elem;
  3.  
  4. ...
  5.  
  6. MainFile.write(reinterpret_cast<unsigned char*>(&Elem),sizeof(Tessera));




E' cosa c'è di diverso in quello che ho fatto io? è questo che non riesco a capire, formalmente mi sembra tutto giusto :(

@totipianurese: Ora provo a dare un occhio alla tua documentazione, per confrontarmi, perché più che usare qualcosa di preimpostato vorrei e dovrei farlo da solo, è un progetto per l'esame di Informatica.

Grazie ad entrambi


Ultima modifica effettuata da Iago90 il 27/07/2010 alle 18:47
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 950
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 19:00
Martedì, 27/07/2010
Testo quotato

Postato originariamente da Iago90:

Testo quotato

Postato originariamente da gigisoft:

Salve:
in genere per salvare su file una variabile di tipo di dato qualsiasi bisogna fare in modo ( attraverso un cast ) che venga visto come un insieme di caratteri; piu' o meno cosi':

Codice sorgente - presumibilmente Plain Text

  1. fstream MainFile;
  2. Tessera Elem;
  3.  
  4. ...
  5.  
  6. MainFile.write(reinterpret_cast<unsigned char*>(&Elem),sizeof(Tessera));




E' cosa c'è di diverso in quello che ho fatto io? è questo che non riesco a capire, formalmente mi sembra tutto giusto :(

@totipianurese: Ora provo a dare un occhio alla tua documentazione, per confrontarmi, perché più che usare qualcosa di preimpostato vorrei e dovrei farlo da solo, è un progetto per l'esame di Informatica.

Grazie ad entrambi




Ciao!

Ho letto il tuo programma, e ho trovato un semplice conflitto di nomi:

Codice sorgente - presumibilmente Plain Text

  1. ifstream read("Tessere", ios::in | ios::binary);



e

Codice sorgente - presumibilmente Plain Text

  1. ifstream read("Tessere", ios::in | ios::binary);



Il nome che hai dato agli stream, sono parole chiave del c, quindi non valide.


Nulla va più veloce della luce, quindi rilassati.
PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 695
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 19:05
Martedì, 27/07/2010
Testo quotato

Postato originariamente da Iago90:

Testo quotato

Postato originariamente da gigisoft:

Salve:
in genere per salvare su file una variabile di tipo di dato qualsiasi bisogna fare in modo ( attraverso un cast ) che venga visto come un insieme di caratteri; piu' o meno cosi':

Codice sorgente - presumibilmente Plain Text

  1. fstream MainFile;
  2. Tessera Elem;
  3.  
  4. ...
  5.  
  6. MainFile.write(reinterpret_cast<unsigned char*>(&Elem),sizeof(Tessera));




E' cosa c'è di diverso in quello che ho fatto io? è questo che non riesco a capire, formalmente mi sembra tutto giusto :(




Guarda:
Codice sorgente - presumibilmente Plain Text

  1. write.write((char*)&lettore, sizeof(tessera)); // Codice tuo
  2.  
  3. MainFile.write(reinterpret_cast<unsigned char*>(&Elem),sizeof(Tessera)); // Codice mio



il cast e' fatto in maniera diversa ( del codice mio sono sicuro perche' lo usai in un progetto tempo fa )


Testo quotato



Grazie ad entrambi




Figurati... non c'e' di che.
Ciao. :k:

Luigi


Le cose si fanno per bene o non si fanno affatto
PM Quote
Avatar
Iago90 (Normal User)
Newbie


Messaggi: 5
Iscritto: 27/07/2010

Segnala al moderatore
Postato alle 19:08
Martedì, 27/07/2010
@Poggi Marco:
Mi dispiace ma l'errore non è quello, mi era venuto il dubbio e comunque gli ho cambiati per sicurezza.

L'output che ricevo è la stampa per 3 o 4 volte dell'ultimo record inserito, con il nome scritto al posto del cognome e così gli altri scalati di una posizione...

Grazie in ogni caso

EDIT: @gigisoft: ora ci provo;

Ultima modifica effettuata da Iago90 il 27/07/2010 alle 19:50
PM Quote
Avatar
Iago90 (Normal User)
Newbie


Messaggi: 5
Iscritto: 27/07/2010

Segnala al moderatore
Postato alle 19:55
Martedì, 27/07/2010
@gigisoft: ci ho provato ma mi da quest'errore:

C:\Users\No_Rules\Desktop\gestione biblioteca\main.cpp(226) : error C2664: 'write' : cannot convert parameter 1 from 'unsigned char *' to 'const char *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

P.S. da notare la pazzia dopo 5 ore di C++, ho messo in automatico ";" dopo "ora ci provo" :rotfl:

Ultima modifica effettuata da Iago90 il 27/07/2010 alle 19:56
PM Quote