Oppure

Loading
27/07/10 15:19
Iago90
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:

//C'è un menu, la scelta 1 è la scrittura dei record e la 2 la lettura dell'elenco

	if(scelta == '1'){
			ofstream write("Tessere", ios::app | ios::binary);
			do{
				lettore.set_tessera();
				write.write((char*)&lettore, sizeof(tessera));
				cin.sync();
				cout<< "Inserire nuova tessera? <s/n>: ";
				cin>> risp;
			}while(risp != 'n');
			write.close();
		}

		if(scelta == '2'){
			system("CLS");
			ifstream read("Tessere", ios::in | ios::binary);
			while(!read.eof()){
				
				read.read((char*)&lettore, sizeof(tessera));
				lettore.get_tessera();
			}
			read.close();
			system("pause");			  
		}

//Le due funzioni lettore.set_tessera() e lettore.get_tessera() le riporto qui di seguito

void tessera::set_tessera(){
	
	system("CLS");
	cout<<"Creazione nuova tessera utente"<< endl<< endl;
	cout<<"id lettore: ";
	cin>> id;
	cout<<"nome: ";
	getline(cin, nome);
	cout<<"cognome: ";
	getline(cin, cognome);
	cout<< "codice fiscale: ";
	getline(cin, codfis);
	cout<< "tel: ";
	getline(cin, tel);
	cout<< "indirizzo: ";
	getline(cin, indirizzo);
	cout<< "citta': ";
	getline(cin, citta);
	cout<< "n. documento di identita': ";
	getline(cin, doc);
	system("CLS");

}

void tessera::get_tessera(){

	cout<< "Visualizzazione tessera lettore"<<endl<<endl;
	cout<< "id lettore: " << id << endl;
	cout<< "nome: " << nome << endl;
	cout<< "cognome: " << cognome << endl;
	cout<< "codice fiscale: "<< codfis<< endl;
	cout<< "indirizzo: " << indirizzo << endl;
	cout<< "citta': " << citta << endl;
	cout<< "tel.: " << tel << endl;
	cout<< "n. documento di identita': " << doc << endl << endl;
}

//Ovviamente fanno capo alla classe tessera:

class tessera {

	int id;
	string nome;
	string cognome;
	string codfis;
	string tel;
	string indirizzo;
	string citta;
	string doc;

public:

	void set_tessera();
	void get_tessera();
	void modifica();
	void elimina();

};


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 27/07/10 15:20
aaa
27/07/10 15:47
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':

fstream MainFile;
Tessera Elem;

...

MainFile.write(reinterpret_cast<unsigned char*>(&Elem),sizeof(Tessera));
Ultima modifica effettuata da gigisoft 27/07/10 15:49
aaa
27/07/10 16:37
totipianurese
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.
pierotofy.it/pages/sorgenti/dettagli/18379-Classe_per_File_-_vdot2dot2/

Saluti
Salvatore
aaa
27/07/10 16:45
Iago90
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':

fstream MainFile;
Tessera Elem;

...

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 27/07/10 16:47
aaa
27/07/10 17:00
Poggi Marco
Postato originariamente da Iago90:

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':

fstream MainFile;
Tessera Elem;

...

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:

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


e

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


Il nome che hai dato agli stream, sono parole chiave del c, quindi non valide.
aaa
27/07/10 17:05
gigisoft
Postato originariamente da Iago90:

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':

fstream MainFile;
Tessera Elem;

...

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:
write.write((char*)&lettore, sizeof(tessera)); // Codice tuo

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 )


Grazie ad entrambi



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

Luigi
aaa
27/07/10 17:08
Iago90
@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 27/07/10 17:50
aaa
27/07/10 17:55
Iago90
@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 27/07/10 17:56
aaa