Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Le soluzioni FSP per il 2026: potenza e IA al centro
Le soluzioni FSP per il 2026: potenza e IA al centro
In occasione del Tech Tour 2025 della European Hardware Association abbiamo incontrato a Taiwan FSP, azienda impegnata nella produzione di alimentatori, chassis e soluzioni di raffreddamento tanto per clienti OEM come a proprio marchio. Potenze sempre più elevate negli alimentatori per far fronte alle necessità delle elaborazioni di intelligenza artificiale.
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS è il principale operatore di servizi cloud al mondo e da tempo parla delle misure che mette in atto per garantire una maggiore sovranità alle organizzazioni europee. L'azienda ha ora lanciato AWS European Sovereign Cloud, una soluzione specificamente progettata per essere separata e distinta dal cloud "normale" e offrire maggiori tutele e garanzie di sovranità
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Xiaomi ha portato sul mercato internazionale la nuova serie Redmi Note, che rappresenta spesso una delle migliori scelte per chi non vuole spendere molto. Il modello 15 Pro+ punta tutto su una batteria capiente e su un ampio display luminoso, sacrificando qualcosa in termini di potenza bruta e velocità di ricarica
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


Le soluzioni FSP per il 2026: potenza e IA al centro Le soluzioni FSP per il 2026: potenza e IA al ce...
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Un hotel italiano fa incetta di recensio...
OnePlus Nord 5 in super offerta su Amazo...
L'innovazione in tournée: arrivan...
Addio al caos dei gruppi Whatsapp: arriv...
Il nuovo chip a 2 nm di Samsung si mostr...
IBM Enterprise Advantage: consulenza per...
Samsung celebra Milano Cortina 2026 con ...
Aritmie cardiache, cresce il numero di c...
Rinviato il secondo lancio del razzo spa...
iPhone 18 Pro: Dynamic Island più...
Pazzesco successo di Xiaomi: la nuova SU...
Il terzo lancio del razzo spaziale Blue ...
Tesla toglie la componente umana dai Rob...
Google Pixel 10 Pro in super offerta su ...
Masters of the Universe: He-Man torna al...
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: 18:17.


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