Newsgroup: it.comp.lang.c++
Titolo: Struct e files

Ho questa struct:
code:-----------------------------------------------------------------------
-------struct conf
{
char cognome [50];
int vers;
char lingua[2];
};
 ---------------------------------------------------------------------------
---
Come la scrivo su files con il C++ standard?
--
Ciao da Kleidemos
C++ Programmer
Visual C++ 6

 };
COSI':
#include <stdio.h>
int salva()
{
  conf prova;
  prova.cognome="fdsnio";
  prova.lingua="ds"; 
  prova.vers=54;
  FILE *f;
  f=fopen("nomefile.txt","w")
  fwrite(prova,sizeof(conf),1,f);
  fclose(f);
  return TRUE;
}
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

   fwrite(prova,sizeof(conf),1,f);
Si, questo metodo funziona. Non e' detto pero' che se scrivi la struttura su
di una macchina riesci poi a rileggerla su di un altra macchina. Se le
strutture vengono lette e scritte dalla stessa macchine (O.S. + eseguibile
prodotto dallo stesso compil) allora funziona.
Insomma non e' il massimo della portabilita'!
Inoltre stai usando funzioni C e non C++.
Tommy

 Come la scrivo su files con il C++ standard?
Beh: visto che di C++ stiam parlando, e non di C, ti conviene farne un 
oggetto serializzabile su uno stream.
Ad esempio
----------------------------------------------------------------------
#include <string>
#include <iostream>
using namespace std;
struct Conf
{
     string cognome;
     int vers;
     string lingua;
};
// Serializza la struttura su un ostream
ostream & operator << (ostream & ostr, const Conf & obj)
{
     ostr << "cognome: " << obj.cognome << endl;
     ostr << "vers: " << obj.vers << endl;
     ostr << "lingua: " << obj.lingua << endl;
     return ostr;
}
// Ripesca la struttura da un istream (da implementare)
istream & operator >> (istream & istr, Conf & obj)
{
     // Facile esercizio lasciato al lettore... ;-)
     // ...
     return istr;
}
int main()
{
     Conf my_conf;
     // Qui sarebbe molto meglio che
     // Conf avesse un costruttore...
     my_conf.cognome = "Ianeselli";
     my_conf.vers = 42;
     my_conf.lingua = "it";
     cout << my_conf;
     return 0;
}
----------------------------------------------------------------------
Chiaramente, al posto di cout puoi usare un qualsiasi derivato di 
ostream, e potrai definire l'operatore << come vuoi, e potrai definire
un operatore >> analogo che rilegga la struttura da un istream.
E se posso ribadire il concetto, 
fwrite(&mystruct,sizeof(mystruct),1,outfile) è nella stragrande 
maggioranza dei casi una soluzione assolutamente del menga, anche da un 
punto di vista di usabilità dei dati da parte di altri.
Mi son inoltre permesso di cambiare i tipi di cognome e lingua in 
std::string, visto che c'è e funziona bene. Se hai bisogno di far delle 
verifiche sulla lunghezza, definisci una classe invece di una struttura, 
con i membri privati, e con un costruttore pubblico che verifichi 
l'integrità delle cose (ovviamente, le funzioni di serializzazione e 
deserializzazione dovranno essere friend della classe, in questo caso).
-- 
  |   \    \  | ___|_  |_  | ianezz a casa sua... :-)
  |  _ \  | \ | _|    /   /  Visita il LinuxTrent a
_|_/  _\_|  _|____|___|___| 
http://www.linuxtrent.it

 ha scritto nel messaggio
news:b628e4$6cc$1...@hercules.btinternet.com...

Una informazione, potrei usare questo codice per creare un file di testo,
per poter fare una funzione sulla presenza o meno di questo file?
Dimenticavo io sviluppo su Windows Xp ma dovrà funzionare su Windows 95 o
pocket pc 2000/20002. Nel caso non vada bene, mi potete dare una dritta, per
quel che mi serve questo file può anche essere vuoto.
Grazie
Simone