Newsgroup: it.comp.lang.c++
Titolo: file e strutture...

Ho creato una struttura ora come posso scrivere l'intera struttura in un
file su disco ?
C'e' un istruzione ?
Il file deve essere per forza di tipo binario ?
Qualcuno puo' postarmi qualche link o esempio ?
Grazie.


fwrite(&struttura, sizeof(struttura), 1, FILE *);
usare il tipo binario è importante utilizzando le strutture...
--------------------------------
Inviato via 
http://usenet.libero.it

 usare il tipo binario è importante utilizzando le strutture...
ok, devo aggiungere che questo non garantisce la portabilita' del file di
output prodotto su di un'altra macchina (architettura diversa) sulla quale
abbiamo pure compilato il nostro sorgente C. Quello che voglio dire e' che
se la macchina con architettura A produce il file pippo.out non e' detto che
la macchina con architettura B scriverebbe pippo.out allo stesso modo (e
quindi le due hanno grossi problemi a scambiarsi i files!).
Tommy

 output prodotto su di un'altra macchina (architettura diversa)
E neanche sulla stessa architettura se una versione diversa del 
compilatore decidesse un bel giorno di riordinare i membri della 
struttura in maniera diversa.
-- 
   |   \    \  | ___|_  |_  | ianezz a casa sua... :-)
   |  _ \  | \ | _|    /   /  Visita il LinuxTrent a
  _|_/  _\_|  _|____|___|___| 
http://www.linuxtrent.it

 struttura in maniera diversa.
gia' !
Tommy


Sono ca..i!!



Fatti un serializzatore a mano e inseriscilo come un metodo dell'oggetto
int Serializzati(File *file){ ... }
ti scegli il formato ( va molto di moda xml ... ) e te lo fai uguale per la
deserializzazione
eg
Se hai un campo privato, x, intero che vale 10 scrivi
<attribute name="x" type="int" visibility="private">10</attribute>
Analogamente ti fai un metodo Deserializzati che carica l'oggetto da un file
oppure puo' essere uno dei costruttori a creare l'oggetto a partire dal
file.
Torniamo a xml.
I vantaggi di xml:
* lo leggi anche tu umano e trovi gli errori quindi puo' facilitare il debug
* e' endian-tollerant ( l' intero e' diventato una stringa 10 => "10" )
* e' indipendente dalla posizione, ogni campo e' identificato dal nome e il
tipo oltre che dal valore
* puoi fare classi cross language: una applicazione c++ apre un socket ci
spara l'xml e dall'altra parte java (o c#) ri istanzia la classe partendo
dai dati (l' applicazione java dovrebbe avere una classe sorella di quella
del c++ o se la potrebbe creare con la reflection, pero' dovresti spedire
anche info sui metodi)
* va di moda (ok ... non e' un vantaggio... ma fa figo :) )
Gli svantaggi di xml:
* un intero di 4 bytes occupa da 1 a 10 bytes, analogo per gli altri tipi
* va parsato (ma ci sono gia' le librerie) ma comunque non e' il max della
velocita'
ciao,
Nids
ps: un problema della write "liscia" e' che se scrivi la classe su un file,
modifichi il programma e lo ricompili ci sta che quando tiri su la classe ci
possa essere qualche problemino con i puntatori e i membri statici della
classe... ma non ho controllato fai un paio di prove. Potresti non avre
compatibilita' fra le varie versioni del tuo programma.
Ovviamente con xml questo non dovrebbe succedere se non modifichi la classe
serializzata

fwrite(&struttura, sizeof(struttura), 1, FILE *);
Prendo spunto e chiedo un altra cosa:
come mai quando uso quest'istruzione:	fread(puntatore_a_int, 3, 1, FILE *);
e il primo dei byte prelevati ha valore 0x1A
mette nell'intero 0x000000 e anche nelle successive fread ?
Grazie per l'attenzione 
-- 
Ciao,
Andrea (uno dei tanti)

mette nell'intero 0x000000 e anche nelle successive fread ?
Non hai aperto il file in modalita' binaria.
Il carattere 0x1A (ctrl-z) ai tempi degli antichi romani
(o giu' di li') veniva usato per indicare la fine file.
HTH
Andrea

Non hai aperto il file in modalita' binaria.
Il file lo aprivo con fopen("nome_file","r");
dunque: fopen("nome_file","rb"), giusto ?
C'e' un modo piu' ad "alto livello" rispetto a questo (stile C)?
Ancora grazie
