Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media
Nel Formula 1 Technology and Media Centre di Biggin Hill, la velocità delle monoposto si trasforma in dati, immagini e decisioni in tempo reale grazie all’infrastruttura Lenovo che gestisce centinaia di terabyte ogni weekend di gara e collega 820 milioni di spettatori nel mondo
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica
Il nuovo gimbal mobile DJI evolve il concetto di tracciamento automatico con tre modalità diverse, un modulo multifunzionale con illuminazione integrata e controlli gestuali avanzati. Nel gimbal è anche presente un'asta telescopica da 215 mm con treppiede integrato, per un prodotto completo per content creator di ogni livello
Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce
Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce
Abbiamo provato il nuovo HUAWEI Pura 80 Pro. Parliamo di uno smartphone che è un vero capolavoro di fotografia mobile, grazie ad un comparto completo in tutto e per tutto, In questa colorazione ci è piaciuto molto, ma i limiti hardware e software, seppur in netto miglioramento, ci sono ancora. Ma HUAWEI ha fatto davvero passi da gigante per questa nuova serie Pura 80. Buona anche l'autonomia e soprattutto la ricarica rapida sia cablata che wireless, velocissima.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-03-2010, 23:16   #1
Emalele1688
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??
Emalele1688 è offline   Rispondi citando il messaggio o parte di esso
Old 17-03-2010, 01:55   #2
fero86
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/



Quote:
Originariamente inviato da Emalele1688 Guarda i messaggi
Si può magari anche definire un nuovo formato di file?? Come??
come ti pare: hai carta bianca, il significato di ogni singolo byte lo decidi tu.
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 17-03-2010, 20:03   #3
Emalele1688
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??
Emalele1688 è offline   Rispondi citando il messaggio o parte di esso
Old 17-03-2010, 20:42   #4
sadino90
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)
sadino90 è offline   Rispondi citando il messaggio o parte di esso
Old 17-03-2010, 20:48   #5
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da Emalele1688 Guarda i messaggi
Si quello l'ho capito, ma come salvo sul disco il singolo byte?? Che API uso per interfacciarmi con la memoria di massa??
Quello che stai cercando di fare te si chiama serializzazione. In C++ non è una operazione banale. La serializzazione binaria è poi dipendente dal compilatore.

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));
Ci sono varie librerie per la serializzazione che gestiscono anche i casi più complessi come s11n.net e boost.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 18-03-2010, 01:06   #6
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
Quote:
Originariamente inviato da Emalele1688 Guarda i messaggi
Si quello l'ho capito, ma come salvo sul disco il singolo byte??
metodo write di ostream, ereditata da fstream.



Quote:
Che API uso per interfacciarmi con la memoria di massa??
non si usano API per accedere alla memoria principale, il linguaggio permette di accedervi direttamente...
il metodo write di cui sopra prende tra i parametri un puntatore ai dati (situati in memoria principale) che vuoi scrivere sullo stream



Quote:
Originariamente inviato da sadino90 Guarda i messaggi
Se non ho capito male basta che copi il contenuto degli attributi della classe nel file...
"basta"? ma perché, il problema qual era? salvare lo stato di un oggetto su un file mi pare che voglia dire salvare lo stato dei singoli campi, o no?

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:
ovviamente non a casaccio ma dandogli un minimo di struttura (se è solo una classe ti basta mettere un attributo per riga, per dire)
be', io finora ho ipotizzato che tu salvassi in formato binario (infatti ti dicevo di usare ostream::write) ma naturalmente puoi anche inventare un formato testuale; anzi, il formato testuale é d'obbligo se devi evitare problemi di endianness.



Quote:
Originariamente inviato da tomminno Guarda i messaggi
Quello che stai cercando di fare te si chiama serializzazione. In C++ non è una operazione banale.
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.
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 18-03-2010, 10:08   #7
sadino90
Junior Member
 
Iscritto dal: Mar 2010
Messaggi: 8
Quote:
Originariamente inviato da fero86 Guarda i messaggi
"basta"? ma perché, il problema qual era? salvare lo stato di un oggetto su un file mi pare che voglia dire salvare lo stato dei singoli campi, o no?

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?
Provo ad azzardare una cosa, che non ho mai fatto, spero di non dire una cavolata
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
sadino90 è offline   Rispondi citando il messaggio o parte di esso
Old 18-03-2010, 14:10   #8
fero86
Senior Member
 
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
Quote:
Originariamente inviato da sadino90 Guarda i messaggi
Provo ad azzardare una cosa, che non ho mai fatto, spero di non dire una cavolata
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.
se vuoi... ripeto, hai carta bianca, fai un po' come ti pare; se ti conviene fare cosi fai cosi.



Quote:
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
perché? anzi, ti risparmi la creazione di un altro file e la relativa gestione degli errori.
fero86 è offline   Rispondi citando il messaggio o parte di esso
Old 18-03-2010, 22:56   #9
Emalele1688
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...
Emalele1688 è offline   Rispondi citando il messaggio o parte di esso
Old 18-03-2010, 23:05   #10
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da Emalele1688 Guarda i messaggi
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...
E' solo un esempio, l'estensione non ha alcun significato specifico, potresti usare txt o pdf o docx o non usarla affatto.
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.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 23-03-2010, 21:51   #11
Emalele1688
Member
 
Iscritto dal: Oct 2009
Messaggi: 157
Già immaginavo... Dunque anche in questo caso si ricorre agli stream del c++ ...
Emalele1688 è offline   Rispondi citando il messaggio o parte di esso
Old 23-03-2010, 23:27   #12
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da Emalele1688 Guarda i messaggi
Già immaginavo... Dunque anche in questo caso si ricorre agli stream del c++ ...
Devi considerare che quello funziona in casi banali di classi contenitore.
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.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 24-03-2010, 21:09   #13
Emalele1688
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??
Emalele1688 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media Il cuore digitale di F1 a Biggin Hill: l'infrast...
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica DJI Osmo Mobile 8: lo stabilizzatore per smartph...
Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce Recensione Pura 80 Pro: HUAWEI torna a stupire c...
Opera Neon: il browser AI agentico di nuova generazione Opera Neon: il browser AI agentico di nuova gene...
Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi Wind Tre 'accende' il 5G Standalone in Italia: s...
PlayStation Portal: arriva lo Streaming ...
iPad Air 13'' (M2) in offerta: sconto di...
Schiaffo al copyright: utilizzare materi...
realme GT 8 Pro porta le fotocamere inte...
JBL Clip 5 a soli 39€ su Amazon: lo spea...
Apple pronta a pagare 1 miliardo l'anno ...
Apple non dimentica gli iPhone più...
Nintendo si prepara a dare il benservito...
Arriva la Canon R6 Mark III con un obiet...
Una famiglia ha ridotto un conto ospedal...
Le carte collezionabili dell'INPS conqui...
Football Manager 26 debutta su Steam con...
A 189,99€ con coupon: il NAS UGREEN che ...
Arm cresce ancora: ricavi oltre 1 miliar...
Xiaomi Redmi Note 14 5G ora a soli 179€:...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 11:59.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v