|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Oct 2009
Messaggi: 157
|
[C++] Creare un file contenete l'istanza di una classe..
Salve a tutti!!
E' da un pò che mi chiedo diverse domande per quanto riguarda l'argomento File in c++. Fino ad oggi ho sempre usato fread ed fopen per leggere e scrivere file, ma se volessi fare di più, come creare un File contenente l'istanza di una classe come faccio?? Esempio: NomeClasse* obj = new NomeClasse(); Voglio salvare l'oggetto puntato da obj su un file (anche un file binario), come faccio?? Si può magari anche definire un nuovo formato di file?? Come?? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
premessa: in C++ non si usano fopen e fread, quelle fanno parte della libreria di I/O del C. in C++ si usa fstream. to': http://www.cplusplus.com/reference/iostream/fstream/
come ti pare: hai carta bianca, il significato di ogni singolo byte lo decidi tu. |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Oct 2009
Messaggi: 157
|
Si quello l'ho capito, ma come salvo sul disco il singolo byte?? Che API uso per interfacciarmi con la memoria di massa??
|
|
|
|
|
|
#4 |
|
Junior Member
Iscritto dal: Mar 2010
Messaggi: 8
|
Se non ho capito male basta che copi il contenuto degli attributi della classe nel file... ovviamente non a casaccio ma dandogli un minimo di struttura (se è solo una classe ti basta mettere un attributo per riga, per dire)
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Una versione minimale e funzionante solo nei casi estremamente semplici è: Codice:
NomeClasse nc;
ofstream ofs("NomeClasse.bin", ios::binary);
ofs.write((char *)&nc, sizeof(nc));
|
|
|
|
|
|
|
#6 | ||||
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
Quote:
![]() il metodo write di cui sopra prende tra i parametri un puntatore ai dati (situati in memoria principale) che vuoi scrivere sullo stream ![]() Quote:
![]() se l'oggetto contiene due campi interi e un booleano tu salvi sul file due interi e un booleano; se contiene un double e una struttura o classe contenente a sua volta tre interi tu salvi il double e poi i tre interi. poi quando rileggi il file sei in grado di costruire un oggetto che ha lo stesso identico stato, o no? la situazione si complica quando un oggetto contiene dei puntatori a qualcos'altro, ma li devi vedertela tu a seconda di cosa significano e come vuoi gestire quei puntatori. Quote:
non é un'operazione banale se vuoi realizzare un'infrastruttura generica che possa funzionare con qualunque oggetto, ma se gli oggetti sono tuoi e sai come sono fatti a me pare una stronzata, poi magari mi sfugge qualcosa. |
||||
|
|
|
|
|
#7 | |
|
Junior Member
Iscritto dal: Mar 2010
Messaggi: 8
|
Quote:
I puntatori ovviamente ti possono puntare ad un altro oggetto anch'esso abbastanza complesso con strutture al suo interno e magari altri puntatori. Di certo non ti puoi salvare il valore del puntatore perchè sarebbe la locazione di una cella di memoria e quindi poi non riusciresti più a risalire al tuo oggetto. In questo caso puoi fare una creazione di file in cascata, ogni qual volta trovi un puntatore ad un oggetto crei un nuovo file contenente tale oggetto e nel file dove dovresti metterci il puntatore a questo oggetto metti il nome del file dove esso viene salvato. Troppo macchinosa come cosa? Ovviamente se vuoi evitare la creazione di un sacco di file puoi fare tutto all'interno dello stesso file però io personalmente non mi avventurerei in una cosa del genere |
|
|
|
|
|
|
#8 | ||
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
Quote:
|
||
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Oct 2009
Messaggi: 157
|
Scusate la domanda banale, ma per quanto riguarda Linux so bene che non ci sono problemi con l'estensione del file da creare (correggetemi se sbaglio), ma in Windows devo usare per forza il .bin o me lo posso inventare io???
A me interessa farlo tanto in Windows come in Linux... |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Solo che facendo doppio click il programma di default associato a quella estensione ti avviserà che il file è corrotto (eccetto il txt) e questo comportamento lo otterrai sia su Linux che su Windows. |
|
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Oct 2009
Messaggi: 157
|
Già immaginavo... Dunque anche in questo caso si ricorre agli stream del c++ ...
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Se la tua classe contiene un puntatore o peggio ancora un riferimento quello che ottieni rileggendo il file è qualcosa di inutilizzabile. Infine per gli stream, essendo il linguaggio C++, è il modo più naturale per scrivere su un file, niente vieterebbe di usare le funzioni C per l'accesso ai file. |
|
|
|
|
|
|
#13 |
|
Member
Iscritto dal: Oct 2009
Messaggi: 157
|
E se io volessi creare un file, che contiene classi ed altri file, per esempio file di testo o addirittura immagini...
Praticamente sto facendo un piccolo gioco (molto cretino a scopo didattico) e voglio salvare lo stato del giocatore... Le informazioni necessarie sono contenute in una classe, e se volessi inserire nel file un'immagine?? |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:59.






















