Newsgroup: it.comp.lang.c++
Titolo: Lettura scrittura di una struttura record su un file

Premesso che sono un principiante sul C++ vorrei sapere se qualcuno puoi
darmi un progetto di esempio molto semplice per leggere e scrivere un record
strutturato su un file..
Esempio del record che vorrei scrivere:
struct persona
{
    char[16]  Nome
    unsigned Eta:3
    unsigne Altezza:4
}
Si puo' essere che la struttura l'abbia scritta male....ma spero di aver
spiegato ugualmente quello che mi servirebbe..se qualcuno e' cosi' gentile
da darmi un esempi...grazie

 da darmi un esempi...grazie
Ho scritto velocemente un esempio, non so se ci sono errori, l'ho provato e
mi sembra funzionare...
In pratica o derivando la tua struttura o scrivendo tutto in un unica
classe, puoi memorizzare il contenuto in due modi.
Il primo è molto semplice (PersistenzaBinaria) dove vengono salvati i bit
dentro la tua struttura. Questò metodo ha problemi di compatibilità fra le
diverse architetture ma ha anche il problema che è garantito solo con tipi
"statici", potrebbe non funzionare con oggetti complessi che allocano
memoria o creano altri oggetti.
Il secondo (PersistenzaPortabile) invece è portabile, a patto che i tipi
della tua struttura abbiano l'overload degli operatori << e >> (altrimenti
il compilatore ti darà errore) per gli oggetti stream (in pratica tutti i
tipi standard l'hanno) mentre per le classi che ti crei tu devi fare
l'overload dell'operatore.
Il programma non è il massimo e le spiegazioni sono veloci (non ho tempo e
non avevo esempi "fatti"), però ti dovrai accontentare... intanto fatti
un'idea! Ad esempio un problema di questo programma è che non supporta gli
spazi nella stringa del nome... quì dovrai scrivere codice ad hoc (ad
esempio usare std::string e la funzione getline).
Ciao e auguri.
#include <fstream>
#include <iostream>
using namespace std;
const char* filename="file.txt";
struct persona
{
    char Nome[16];
    unsigned int Eta;
    unsigned int Altezza;
};
class CPersona : public persona
{
        public:
        void inserisci()
        {
                cout << "Inserisci nome: ";cin >> Nome;
                cout << "Inserisci eta' : ";cin >> Eta;
                cout << "Inserisci altezza : ";cin >> Altezza;
        }
        void scrivi()
        {
                cout << "Nome : " << Nome << " Eta' : " << Eta
                << " Altezza : " << Altezza << endl;
        }
        CPersona()
        {
                *Nome=0;
                Eta=0;
                Altezza=0;
        }
};
class PersistenzaBinaria : public CPersona
{
        public:
        virtual void Read(ifstream& ifn)
        {
                ifn.read(reinterpret_cast<char*>(this),sizeof(persona));
        }
        virtual void Write(ofstream& out)
        {
                out.write(reinterpret_cast<const
char*>(this),sizeof(persona));
        }
};
class PersistenzaPortabile : public CPersona
{
        public:
        virtual void Read(ifstream& ifn)
        {
                ifn >> Nome;
                ifn >> Eta >> Altezza;
        }
        virtual void Write(ofstream& out)
        {
                out << Nome << " " << Eta << " " << Altezza << endl;
        }
};
int main()
{
        PersistenzaPortabile a,b; // oppure prova PersistenzaBinaria a,b;
        a.inserisci();
        a.scrivi();
        cout << "ora scrivo il file...";
        ofstream out(filename);
        a.Write(out);
        out.close();
        cout << "\nora rileggo il file...";
        ifstream in(filename);
        b.Read(in);
        in.close();
        cout << "\nho riletto:\n";
        b.scrivi();
        return 0;
}