Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

17.7.1 Merkkijonosta tietovirta

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 stringstream 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.

Edellisessä esimerkissä olisi voitu erota-funktion tilalla käyttää merkkijonovirtojakin:

	#include <sstream> 
	...
	  while ( getline(fi,rivi) ) {
	    istringstream is(rivi);
	    getline(is,nimike,'|');  poista_tyhjat(nimike);
	    getline(is,pala,'|');    if ( !luvuksi(pala,hinta) ) continue;
	    getline(is,pala,'|');    if ( !luvuksi(pala,kpl) ) continue;
	    printf("%-20s %7.0lf %4d\n",nimike.c_str(),hinta,kpl);
	  }

Merkkijonotietovirrasta voitaisiin ottaa suoraan numeerinenkin arvo:

	is >> hinta;

Esimerkissä kuitenkin tulisi ongelmaksi tällöin tolppien poisto, jonka getline ja erota osaavat hoitaa. Merkkijonovirtojen suurin ongelma on siinä, että ne tulivat vasta uusimman standardin mukana ja voi vielä löytyä kääntäjiä, joissa merkkijonovirtoja ei ole toteutettu

Voidaan tehdä myös merkkijonotietovirta tulostamista varten:

	  ostringstream os;
	  os << "Volvo " << "|";
	  os << 12300.00 << "|";
	  os << 1;
	  string s = os.str();  // s = "Volvo |12300|1"

Tällä tavalla voidaan numeerisia arvoja muuttaa varsin mukavasti merkkijonoiksi.


Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys