previous next Up Title Contents Index

17.7.1 Merkkijonosta tietovirta

Ohjelmassa on pystytty välttämään palanen- tyylisen aliohjelman käyttö luomalla merkkijonosta tietovirta:
	int rivi_tuotteeksi(char *rivi, tTuote &tuote)
	{
	  istrstream sstr(rivi);
	  return lue(sstr,tuote);
	}
Koska tämä tietovirta käyttäytyy aivan samoin kuin päätesyöttökin, voidaan tehdä aliohjelma lue, joka lukee tuotteen tiedot ikäänkuin tiedostosta. Itse asiassa ohjelman lukusilmukassa voitaisiin aivan hyvin kutsua myös
	while ( 1 ) {
	  if ( lue(fi,tuote) ) break;
	  printf("%-20s %7.0lf %4d\n",tuote.nimike.c_str(),tuote.hinta,tuote.kpl);
	}
mutta tällöin lukeminen loppuisi ensimmäiseen virheeseen tai sopivalla tiedostolla rivijako menisi sekaisin. Tämän vuoksi luettaessa tiedostoja joissa rivi on "yksi tietue", kannattaa lukea ensin rivin sisältö merkkijonoon ja sitten muuttaa tämä merkkijono tietueeksi.

C:ssä merkkijonoa yritettiin purkaa sscanf- funktiolla, joka onkin erittäin helppokäyttöinen niin kauan kuin merkkijono sisältää vain lukuja, jotka voidaan kaikki erottaa kerralla. Jos kuitenkin erotettavien osien joukossa on merkkijonoja, menee ongelma tunnetusti hankalammaksi (tosin voidaan hoitaa erikoistapauksissa).

Jos kuitenkin merkkijonosta pitää saada 0-n erillistä osaa (merkkijonoa tai lukua), ei sscanf:ää voida käyttää!

C++:n strstream on taas siitä mukava, että se tekee merkkijonoon samanlaisen "lukuosoittimien" kuin muutkin tietovirrat tiedostoon. Näin voidaan palasia erotella yksi kerrallaan ja "lukemista" voidaan jatkaa siitä, mihin edellinen lukeminen jäi.


previous next Up Title Contents Index