PDA

Visualizza la versione completa : [C++] classe libro memorizzata in un file binario


alukard990
24-01-2012, 18:31
Salve a tutti vi spiego in poche parole il succo di questo software: voglio realizzare una classe libro che implementa delle funzionalità(non le dico tanto penso che sono palesi leggendo il codice che posterò alla fine);tra le varie funzionalità si vogliono memorizzare i dati di un certo numero di libri in un file binario;inoltre si vuole implementare una classe pila dinamica che legge i libri dal file binario precedentemente memorizzato. Funzionerebbe tutto bene ma c'è un piccolo problema: nella funzione push della classe pila in input voglio fornire il nome del file da leggere ma per qualche bizzarria(o mio errore ma credo più questo :D)a tempo di esecuzione non mi da la possibilità di inserire il nome del file e quindi in output dovrei avere "File inesistente!" ma per qualche coincidenza il file viene letto e memorizzato nella pila...qualcuno può aiutarmi? grazie mille a tutti per la vostra disponibilità



#ifndef PACCOP_H_
#define PACCOP_H_
#include <iostream>
#include <fstream>

using namespace std;

class paccop{


private:
char *indirizzo;
int codice;
float peso;

public:
paccop(const char* i="",const int c=0,const float p=0.0)
{indirizzo=new char[strlen(i)+1];strcpy(indirizzo,i);codice=c;peso=p;}
paccop(const paccop &);
const paccop & operator=(const paccop &);
const char* get_indirizzo()const {return indirizzo;}
int get_codice()const {return codice;}
float get_peso()const {return peso;}
void set_indirizzo(const char* I) {if(indirizzo) delete[] indirizzo; indirizzo=new char[strlen(I)+1];strcpy(indirizzo,I);}
void set_codice(const int C) {codice=C;}
void set_peso(const float P) {peso=P;}
int scrivifile();
friend istream& operator>>(istream&,paccop &);
friend ostream& operator<<(ostream&,const paccop &);

};

#endif
#include "paccop.h"

paccop::paccop(const paccop & P)
{
indirizzo=new char[strlen(P.indirizzo)+1];
strcpy(indirizzo,P.indirizzo);
codice=P.codice;
peso=P.peso;
}

const paccop & paccop::operator=(const paccop & P)
{
if(this!=&P)
{
if(indirizzo) delete[] indirizzo;
indirizzo=new char[strlen(P.indirizzo)+1];
strcpy(indirizzo,P.indirizzo);
codice=P.codice;
peso=P.peso;
}
}

ostream& operator<<(ostream& os,const paccop & P)
{
os<<"*****Dati pacco postale*****\n";
os<<"Indirizzo: "<<P.indirizzo<<"\n";
os<<"Codice: "<<P.codice<<"\n";
os<<"Peso: "<<P.peso<<"\n";
return os;
}

istream& operator>>(istream& is,paccop & P)
{
cout<<"******Inserimento dati pacco*****\n";
char buffer[50];
cout<<"Indirizzo: ";
is.getline(buffer,49);
if(P.indirizzo) delete[] P.indirizzo;
P.indirizzo=new char[strlen(buffer)+1];
strcpy(P.indirizzo,buffer);
cout<<"Codice: ";
is>>P.codice;
cout<<"Peso: ";
is>>P.peso;
return is;
}
int paccop::scrivifile()
{
char namefile[30];
cout<<"Inserisci nome del file su cui vuoi scrivere: ";
cin>>namefile;
ofstream ofs(namefile,ios::binary);
char buffer[30];
int cod;
float p;
int nelem=0;
cout<<"Inserisci indirizzo,codice e peso del pacco postale\n";
while(cin>>buffer>>cod>>p)
{
int size=strlen(buffer);
strcpy(indirizzo,buffer);
ofs.write((const char*)(&size),sizeof(int));
ofs.write(indirizzo,size*sizeof(char));
codice=cod;
ofs.write((const char*)(&codice),sizeof(int));
peso=p;
ofs.write((const char*)(&peso),sizeof(float));
nelem++;
}
ofs.close();
return nelem;

}

#ifndef PILAD_H_
#define PILAD_H_
#include "paccop.h"


typedef paccop E;
struct nodo;
typedef nodo* L;
struct nodo{
E elem;
L punt;
};

class pilad{

private:
L l;

public:
pilad(){l=0;}
~pilad();
void push(const int);
void lastpop();
void top();
bool empty()const{return l==0;}
bool full()const {return false;}
void scrividati();
void stampadati();

};
#endif
#include "pilad.h"

pilad::~pilad()
{
L p,q;
for(p=l;p!=0;p=q)
{
q=p->punt;
delete p;
}
}

void pilad::push(const int n)
{
char name[30];
int size=0;
char buffer[50];
int code;
float weight;
cout<<"Inserisci nome del file da leggere: ";
cin>>name;
E p;
ifstream ifs(name,ios::binary);
if(!ifs) cerr<<"File inesistente!\n";
else{
for(int i=0;i<n;i++)
{
ifs.read((char*)(&size),sizeof(int));
ifs.read(buffer,size*sizeof(char));
p.set_indirizzo(buffer);
ifs.read((char*)(&code),sizeof(int));
p.set_codice(code);
ifs.read((char*)(&weight),sizeof(float));
p.set_peso(weight);
L q=new nodo;
q->elem=p;
q->punt=l;
l=q;
}
}
}

void pilad::stampadati()
{
L temp=l;
while(temp)
{
cout<<temp->elem;
temp=temp->punt;
}
}

#include <cstdlib>
#include <iostream>
#include "paccop.h"
#include "pilad.h"

using namespace std;

int main(int argc, char *argv[])
{
paccop p;
int n=p.scrivifile();
pilad P;
P.push(n);
P.stampadati();
system("PAUSE");
return EXIT_SUCCESS;
}

alukard990
25-01-2012, 13:19
Scusatemi l'esercizio riguarda la classe pacco postale però il resto va bene...avevo ancora in mente il programma svolto in precedenza :D

Loading