17.7.2 Olio joka lukee itsensä
Muutetaan vielä edellistä oliomaisemmaksi, eli annetaan tuotteelle
kuuluvat tehtävät kokonaan tuote- luokan vastuulle, samalla
lisätään tuotteet- luokka.
tiedosto\tuot_pao.cpp - esimerkki oliosta joka käsittelee tiedostoaa
// Projektiin +ALI\mjonot.c
#include <iostream.h>
#include <iomanip.h>
#include <fstream.h>
#include <strstrea.h>
#include <stdio.h>
#include <string>
using namespace std;
#include "mjonotpp.h"
//----------------------------------------------------------------------------
class cTuote {
string nimike;
double hinta;
int kpl;
void alusta() { nimike = ""; hinta = 0.0; kpl = 0; }
public:
int alusta(const char *rivi) { // Alustaa jonosta Volvo|4500|3
istrstream sstr((char *)rivi);
return lue(sstr);
}
cTuote() { alusta(); }
ostream &tulosta(ostream &os) const {
long oldf = os.setf(ios::left);
os << setw(20) << nimike << " " << setiosflags(ios::right)
<< setw(7) << hinta << " "
<< setw(4) << kpl;
os.flags(oldf);
return os;
}
int lue(istream &is) {
char jono[50];
alusta();
is.getline(N_S(jono),'|'); nimike = poista_tyhjat(jono);
is.getline(N_S(jono),'|');
if ( sscanf(jono,"%lf",&hinta) < 1 ) return 1;
is.getline(N_S(jono),'\n');
if ( sscanf(jono,"%d",&kpl) < 1 ) return 1;
return 0;
}
};
ostream &operator<<(ostream &os,const cTuote &tuote)
{ return tuote.tulosta(os); }
istream &operator>>(istream &is,cTuote &tuote) { tuote.lue(is); return is; }
//----------------------------------------------------------------------------
class cTuotteet {
string nimi;
public:
cTuotteet(const char *n) { nimi = n; }
int tulosta(ostream &os) const;
};
int cTuotteet::tulosta(ostream &os) const
{
cTuote tuote;
char rivi[80];
ifstream f(nimi.c_str()); if ( !f ) return 1;
cout << "\n\n\n";
cout << "-------------------------------------------" << endl;
while ( !f.eof() ) {
if ( !f.getline(N_S(rivi)) ) continue;
if ( tuote.alusta(rivi) ) continue;
os << tuote << endl;
}
cout << "-------------------------------------------\n";
cout << "\n\n\n" << endl;;
return 0;
}
//----------------------------------------------------------------------------
int main(void)
{
cTuotteet tuotteet("TUOTTEET.DAT");
if ( tuotteet.tulosta(cout) ) {
cout << "Tuotteita ei saada luetuksi!" << endl;
return 1;
}
return 0;
}