previous next Up Title Contents Index

19.2.4 Jäsenen tehtävät lukemisessa

Jälleen tehtäviä riitti vähän myös itse jäsenelle. Jäsen pitäisi saada selvitettyä merkkijonosta:

talletus.2\jasen.cpp - alusta

	int cJasen::alusta(const char *rivi) 
	{
	  char *urivi = tee_jono(rivi); // Kopio, koska ei ole const char * alustajaa
	  istrstream sstr(urivi);       // merkkivirralle
	  sstr >> *this;
	  free(urivi);
	  return 0;
	}
Seuraavaksi pitäisi jäsen lukea tietovirrasta:
	istream &operator>>(istream &is,cJasen &jasen)
	{
	  char jono[50]; 
	  is.getline(N_S(jono),'|'); sscanf(jono,"%d", &jasen.tunnus_nro);
	  is.getline(N_S(jono),'|'); nimi = poista_tyhjat(jono);
	  is.getline(N_S(jono),'|'); sotu = poista_tyhjat(jono);
	  ...
	  is.getline(N_S(jono),'|'); sscanf(jono,"%lf", &jasen.maksu);
	  ...
	}
Tämä on taas muuten hyvä, mutta ratkaisua vaivaa tietty epäsymmetria eri tietotyyppien välillä. Lisäksi jos talletuksessa on sovittu, että esimerkiksi -1 tarkoittaa syöttämätöntä arvoa ja talletetaan tyhjänä, pitäisi lukemisessa tämä käsitellä kääntäen. Voitaisiin yrittää myös seuraavaa:

talletus.2\jasen.cpp - lukeminen

	istream &operator>>(istream &is,cJasen &jasen)
	{
	  char erotin = jasen.erotin;
	  ota_seuraava(is,jasen.tunnus_nro      ,erotin);
	  ota_seuraava(is,jasen.nimi            ,erotin);
	  ota_seuraava(is,jasen.hetu            ,erotin);
	  ota_seuraava(is,jasen.katuosoite      ,erotin);
	  ota_seuraava(is,jasen.postinumero     ,erotin);
	  ota_seuraava(is,jasen.postiosoite     ,erotin);
	  ota_seuraava(is,jasen.kotipuhelin     ,erotin);
	  ota_seuraava(is,jasen.tyopuhelin      ,erotin);
	  ota_seuraava(is,jasen.autopuhelin     ,erotin);
	  ota_seuraava(is,jasen.liittymisvuosi  ,erotin);
	  ota_seuraava(is,jasen.jmaksu          ,erotin);
	  ota_seuraava(is,jasen.maksu           ,erotin);
	  ota_seuraava(is,jasen.lisatietoja     ,erotin);
	  if ( jasen.tunnus_nro >= jasen.seuraava_nro )
	    jasen.seuraava_nro = jasen.tunnus_nro + 1;
	  return is;
	}
Funktio ota_seuraava on polymorfinen eri tietotyypeille ja sen tehtävänä on päästä eroon turhista välilyönneistä ja lukea tietovirtaa seuraavaan erotinmerkkiin saakka. ota_seuraava huolehtii myös tyhjän arvon käsittelystä (-1 <=> "").


previous next Up Title Contents Index