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 <=> "").