previous next Up Title Contents Index

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;
	}


previous next Up Title Contents Index