Luento 10

cin-syötöstä

Syöttöpuskurin tyhjennys

cin (console input) on puskuroitu tietovirta. Tämä merkitsee, että yksittäisiä näppäimenpainalluksia ei käsitellä välittömästi, vaan arvot luetaan syöttöpuskuriin (input buffer). Puskuria voidaan ajatella merkkitaulukkona, jonne näppäinkoodit viimeisinpään rivinvaihtoon varastoidaan ennen niiden lukemista virrasta.

Syöttöpuskurissa olevat arvot riippuvat täysin käyttäjän syötteestä. Luettaessa tietovirrasta arvoja puskuriin saattaa jäädä ei-toivottuja merkkejä (käyttäjä on syöttänyt 'enemmän' kuin on kysytty), jotka voivat heijastua tuleviin kyselyihin. Siksi ennen (tai jälkeen) jokaista cin-kyselyä puskuri on tyhjennettävä. Tyhjennys voidaan tehdä esim. seuraavasti:

int merkit = cin.rdbuf()->in_avail(); cin.ignore(merkit,'\n');

rdbuf-metodi palauttaa osoittimen cin-olion syöttöpuskuriin. Syöttöpuskurilla puolestaan on metodi in_avail, joka palauttaa kokonaislukuna puskurissa jäljellä olevien merkkien lukumäärän (0 jos puskurissa ei ole merkkejä). Tämä luku annetaan parametriksi ignore-metodille, joka ohittaa virrasta annetun määrän merkkejä (tai rivinvaihtoon asti).

in_avail-metodin avulla syöttöpuskuri saadaan aina tyhjennettyä tarvittaessa, jolloin seuraava cin-kysely voidaan tehdä 'puhtaalta pöydältä'.

Virheelliset syöttötiedot

Tyypillinen tilanne on, että käyttäjältä halutaan kysyä jonkin luvun arvoa. Käyttäjä saattaa kuitenkin syöttää tiedot väärässä muodossa, esim kirjaimina numeroiden sijaan. Tällaisia tilanteita varten ohjelmassa pitää aina olla käsittely. Virhetilanteiden käsittelyä varten tietovirtoihin on määritelty tilaliput.

Tieto viimeisimmän lukuoperaation onnistumisesta on talletettu cin-olion fail-bittiin. Bitin arvon saa selville seuraavasti:

bool virhe = cin.fail();

Jos fail-bitti on päällä, viimeisintä lukuoperaatiota ei ole saatu suoritettua. Tässä tilanteessa on vähintään syytä tulostaa virheilmoitus, yleensä myös kysyttävä syötettä uudelleen.

Huom! fail-bitin ollessa päällä cin-kutsuilla ei ole vaikutusta ohjelman suorituksessa (tämä voi johtaa helposti esim. ikuiseen silmukkaan). Virhetilanteen havaitsemisen jälkeen fail-bitti on nollattava, jolloin seuraava cin-operaatio voidaan suorittaa normaalisti.

cin.clear(); // palauttaa tietovirran tilaliput normaalitilaan.

fail-bitin nollaamisen lisäksi myös syöttöpuskuri on tyhjennettävä (virheellistä syötettä ei ole saatu luettua, joten se on edellleen puskurissa ja häiritsisi seuraavaa cin-operaatiota ilman tyhjennystä).

Esimerkki: iotest.cpp

cout - muotoilu ja manipulaattorit

cout-oliolla tulostettua tekstiä voi muotoilla yhtä monipuolisesti - ellei monipuolisemmin - kuin printf:n vastaavaa. cout:n muotoilumetodeista on tässä esitetty muutamia esimerkkejä.

Muotoilulippuja:

Huom! Muotoiluliput eivat toimi BC 3.1:n asennusversiossa. Muotoiluliput saa käyttöön kopioimalla päivitetyn iostream.h -tiedoston kääntäjän otsikkotiedostohakemistoon (samaan tapaan kuin merkkijonoluokan käytössä). Päivitystiedosto on asennettu Agoran mikroluokkiin.

Tavanomaisten metodikutsujen (esim. cout.fill(' ')) lisäksi muotoiluja voi tehdä myös suoraan cout-lauseen sisällä manipulaattoreita käyttäen. Manipulaattorit ovat symboleja, jotka voidaan kirjoittaa suoraan parametreina << - operaattorien väliin (esim. endl on manipulaattori). Manipulaattorien määritykset ovat otsikkotiedostossa iomanip.h.

Esim: left, right (kentän tasaus, ei toimi BC 3.1:ssä), scientific, fixed (liukuluvun tulostus, ei toimi BC 3.1:ssä), setfill(int) (täytemerkki), setprecision(int) (tarkkuus), setw (kentän leveys).

Esimerkki: iotest2.cpp, ks. myös form1.cpp

Huom! Esimerkkien ajo BC 3.1:ssä vaatii vstringin (tai vastaavan string-toteutuksen), ks ilmoitukset, merkkijonoluokan käyttö.

http://appro.mit.jyu.fi/2002/kesa/johdatusohjelmointiin/luennot/luento10/index.html
© Miika Nurminen ()
6.06.2002 23:49:02