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