Salve a tutti stavo realizzando un programma che vuole gestire i dati relativi ad un libro; i dati sono: autore(char*),titolo(char*) e anno(int). Oltre ai costruttori e distruttori e alle funzioni get si vogliono realizzare l'oveloading degli operatori di shift ( << e >>) per l'inserimento e la lettura su file binario; Ho realizzato tutto quanto ma il programma mi crasha.Provando ad eseguire step by step forse c'è un problema nell'overloading di << ma non sono sicurissimo.Qualcuno può aiutarmi?
codice:
#ifndef LIBRO_H_
#define LIBRO_H_
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;
class libro{
private:
char* autore;
char* titolo;
int anno;
public:
libro(const char* a="",const char* t="",const int aa=0): autore(new char[strlen(a)+1]), titolo(new char[strlen(t)+1]), anno(aa) {strcpy(autore,a); strcpy(titolo,t); anno=aa;}
libro(const libro &);
~libro() {delete[] autore; delete[] titolo;}
const libro & operator=(const libro &);
const char* get_autore()const {return autore;}
const char* get_titolo()const {return titolo;}
int get_anno()const {return anno;}
friend ofstream& operator<<(ofstream&, libro&);
friend ifstream& operator>>(ifstream&,libro&);
friend ostream& operator<<(ostream&,const libro&);
};
#endif
#include "libro.h"
libro::libro(const libro & L)
{
autore=new char[strlen(L.autore)+1];
strcpy(this->autore,L.autore);
titolo=new char[strlen(L.titolo)+1];
strcpy(this->titolo,L.titolo);
anno=L.anno;
}
ofstream& operator<<(ofstream& ofs, libro& l)
{
int size=strlen(l.autore);
ofs.write(reinterpret_cast<char*>(&size), sizeof(int));
ofs.write(l.autore, size*sizeof(char));
size=strlen(l.titolo);
ofs.write(reinterpret_cast<char*>(&size), sizeof(size));
ofs.write(l.titolo, size*sizeof(char));
ofs.write(reinterpret_cast<const char*>(&l.anno),sizeof(int));
return ofs;
}
ifstream& operator>>(ifstream& ifs,libro& l)
{
int size=0;
ifs.read(reinterpret_cast<char*>(&size), sizeof(int));
ifs.read(l.autore, size*sizeof(char));
ifs.read(reinterpret_cast<char*>(&size), sizeof(int));
ifs.read(l.titolo, size*sizeof(char));
ifs.read(reinterpret_cast<char*>(&l.anno), sizeof(int));
return ifs;
}
ostream& operator<<(ostream& os,const libro & L)
{
os<<"\nAutore: " << L.autore<< "\nTitolo: "<< L.titolo << "\nAnno pubblicazione: " << L.anno <<"\n";
return os;
}
#include <cstdlib>
#include <iostream>
#include "libro.h"
using namespace std;
int main(int argc, char *argv[])
{
libro l("Dan Brown", "Il Codice da Vinci", 2005);
ofstream out("dati.dat", ios::binary);
out<<l;
out.close();
libro p;
ifstream in("dati.dat", ios::binary);
in>>p;
in.close();
cout << p;
system("PAUSE");
return 0;
}