C ++ -opetus: Lisätietoja tuloista ja tuloista

01

08

Uusi tapa tulostaa

Ohjelman koodi
traffic_analyzer / Getty Images

C ++ säilyttää erittäin korkean taaksepäin -yhteensopivuuden C: n kanssa, joten voidaan sisällyttää, jotta pääset käyttämään printf () toiminto ulostulolle. C ++: n tarjoama I / O on kuitenkin huomattavasti tehokkaampi ja mikä tärkeämpää, tyyppiturvallinen. Voit silti käyttää myös scanf () syöttöön, mutta tyyppiset turvallisuusominaisuudet, joita C ++ tarjoaa, tarkoittavat, että sovelluksesi ovat vankempia, jos käytät C ++ -sovellusta.

Edellisessä oppitunnissa tätä käsiteltiin esimerkillä, jossa käytettiin coutia. Täällä mennään hieman syvemmälle aloittamalla lähtö ensin, koska sitä yleensä käytetään enemmän kuin tuloa.

Iostream-luokka tarjoaa pääsyn tarvitsemillesi kohteille ja menetelmille sekä tulostukselle että tulolle. Ajattele i / o tavuvirtojen suhteen - joko sovelluksesta tiedostoon, näytölle tai tulostimeen - joka on lähtö, tai näppäimistöltä - tuloon.

Lähtö Cout-toiminnolla

Jos tiedät C: n, saatat tietää sen << käytetään siirtämään bittejä vasemmalle. Esimerkiksi 3 << 3 on 24. Esimerkiksi vasen siirto kaksinkertaistaa arvon, joten 3 vasen vuoro kertoo sen 8: lla.

instagram viewer

C ++: ssa << on ollut ylikuormittunut ostream-luokassa niin int, kellua, ja jousityypit (ja niiden variantit, esim nelinpeli) tuetaan kaikkia. Näin teet tekstin tulostuksen, merkkijonoksi useita kohteita välillä <<.>


cout << "Jotkut tekstit" << intvalue << floatdouble << endl; 

Tämä erikoinen syntaksi on mahdollista, koska jokainen << on oikeastaan ​​funktion kutsu, joka palauttaa a viite porttiin esine. Joten yllä oleva rivi on oikeastaan ​​tällainen


cout. << ("jokin teksti"). cout. << (intvalue) .cout. << (floatdouble) .cout. << (endl); 

C toimiaprintf pystyi alustamaan tulosteen käyttämällä muotoilun määrityksiä, kuten% d. C ++: ssa cout voi myös alustaa tulosteen, mutta käyttää eri tapaa tehdä se.

02

08

Coutin käyttäminen tulosteen alustamiseen

Object cout on jäsen iostream kirjasto. Muista, että tämä on sisällytettävä


#sisältää 

Tämä kirjasto iostream on johdettu ostream (tuotosta varten) ja istream syöttöä varten.

muotoileminen tekstin tulostuksesta tehdään lisäämällä manipulaattorit lähtövirtaan.

Mikä on manipulaattori?

Se on toiminto, joka voi muuttaa lähtö- ja tulovirran ominaisuuksia. Edellisellä sivulla näimme sen << oli ylikuormitettu toiminto, joka palautti viittauksen kutsuvaan esineeseen esim. cout lähtöä varten tai cin tuloon. Kaikki manipulaattorit tekevät tämän, jotta voit sisällyttää heidät lähtöön << tai syöttö >>. Tarkastelemme syöttöä ja >> myöhemmin tässä oppitunnissa.


laskea << endl; 

endl on manipulaattori, joka lopettaa linjan (ja aloittaa uuden). Se on toiminto, jota voidaan kutsua myös tällä tavalla.


endl (cout); 

Vaikka käytännössä et tekisi sitä. Käytät sitä näin.


cout << "Jotkut teksti" << endl << endl; // Kaksi tyhjää riviä. 

Tiedostot ovat vain virtauksia

Jotain pidettävä mielessä, että nykyään tehdään paljon kehitystä GUI Miksi tarvitset teksti I / O-toimintoja? Eikö se ole vain konsoli sovellukset? No, teet todennäköisesti tiedostojen I / O: n ja voit käyttää niitä myös siellä, mutta myös se, mikä näytölle tulostuu, tarvitsee yleensä myös muotoilun. Streams on erittäin joustava tapa käsitellä tuloa ja lähtöä, ja ne voivat toimia

  • Teksti I / O. Kuten konsoli-sovelluksissa.
  • Strings. Kätevä muotoilulle.
  • Tiedosto I / O.

Manipulaattorit taas

Vaikka olemme käyttäneet ostream luokka, se on johdettu luokka alkaen iOS luokka, joka perustuu ios_base. Tämä esi-ikäluokka määrittelee yleisön tehtävät jotka ovat manipulaattoreita.

03

08

Luettelo Cout-manipulaattoreista

Manipulaattorit voidaan määritellä tulo- tai lähtövirroiksi. Nämä ovat esineitä, jotka palauttavat viittauksen esineeseen ja sijoitetaan parien väliin <<. Suurin osa manipulaattoreista julistetaan, mutta endl, päät ja väri tulen . Useat manipulaattorit ottavat yhden parametrin ja ne tulevat .

Tässä on tarkempi luettelo.

alkaen

  • endl - Lopettaa linjan ja soittaa värin.
  • päättyy - Lisää '\ 0' ( TYHJÄ) streamiin.
  • huuhtelu - Pakota puskuri ulostumaan välittömästi.

alkaen . Suurin osa ilmoitetaan vuonna 2003 - esi-isä . Olen ryhmitellyt ne funktion, ei aakkosten mukaan.

  • boolalpha - Lisää tai poimi booliobjektit "totta" tai "väärään".
  • noboolalpha - Lisää tai purka booliobjekteja numeroarvoina.
  • kiinteä - Lisää liukulukun arvot kiinteään muotoon.
  • tieteellinen - Lisää liukulukujen arvot tieteellisessä muodossa.
  • sisäinen - sisäinen - perustele.
  • vasen - oikealle vasemmalle.
  • oikeassa - oikeassa-perustella.
  • dec - lisää tai poista kokonaislukuarvoja desimaalimuodossa.
  • hex - Lisää tai purka kokonaislukuarvoja heksadesimaalimuodossa (kanta 16).
  • okt. - Lisää tai poista arvoja oktaalimuodossa (pohja 8).
  • noshowbase - Älä etunäytä arvoa sen pohjalta.
  • showbase - etuliite-arvo pohjan kanssa.
  • noshowpoint - Älä näytä desimaalin tarkkuudella, jos ei ole tarpeen.
  • showpoint - Näytä aina desimaalipilkku lisättäessä liukulukuja.
  • noshowpos - Älä lisää plusmerkkiä (+), jos numero> = 0.
  • showpospos - Älä lisää plusmerkki (+), jos numero> = 0.
  • noskipws - Älä ohita alustavaa valkoista tilaa uutettaessa.
  • skipws - Ohita alkuperäinen valkoinen tila uutettaessa.
  • iso iso kirjain - Älä korvaa pieniä kirjaimia vastaavilla isoilla kirjaimilla.
  • iso kirjain - Korvaa pienet kirjaimet isoilla kirjaimilla.
  • unitbuf - Huuhtele puskuri insertin jälkeen.
  • nounitbuf - Älä huuhtele puskuria jokaisen insertin jälkeen.

04

08

Esimerkkejä Coutin käyttämisestä

// ex2_2cpp. #include "stdafx.h" #sisältääkäyttämällä nimitilaa std; int main (int argc, char * argv []) { leveys (10); cout << oikea << "Testi" << endl; cout << vasen << "Test 2" << endl; cout << sisäinen << "Test 3" << endl; cout << endl; leikkaus (2); cout << 45.678 << endl; cout << isot kirjaimet << "David" << endl; leikkaus (8); cout << tieteellinen << endl; cout << 450678762345.123 << endl; cout << kiinteä << endl; cout << 450678762345.123 << endl; cout << showbase << endl; cout << showpos << endl; cout << hex << endl; cout << 1234 << endl; cout << lokakuu << endl; cout << 1234 << endl; cout << joulukuu << endl; cout << 1234 << endl; cout << noshowbase << endl; cout << noshowpos << endl; cout.unsetf (ios:: isot kirjaimet); cout << hex << endl; cout << 1234 << endl; cout << lokakuu << endl; cout << 1234 << endl; cout << joulukuu << endl; cout << 1234 << endl; paluu 0; }

Tulos tästä on alla, selvyyden vuoksi poistetaan yksi tai kaksi ylimääräistä riviväliä.

 Testata. Koe 2. Koe 3. 46. David. 4.50678762E + 011. 450678762345.12299000. 0X4D2. 02322. +1234. 4D2. 2322. 1234. 

Huomautus: Suurista kirjaimista huolimatta David on painettu nimellä David eikä DAVID. Tämä johtuu siitä, että iso kirjain vaikuttaa vain tuotettuun tuotokseen - esim. numerot painettuina heksadesimaali. Joten heksalähtö 4d2 on 4D2, kun isot kirjaimet ovat toiminnassa.

Lisäksi suurin osa näistä manipulaattoreista asettaa vähän lipun ja on mahdollista asettaa tämä suoraan

 cout.setf () 

ja puhdista se

 cout.unsetf () 

05

08

Setf: n ja Unsetf: n käyttäminen I / O-muotoilun manipuloimiseksi

Toiminto itsemuodostetun on kaksi ylikuormittunut alla esitetyt versiot. Sillä aikaa unsetf vain tyhjentää määritetyt bitit.

 setf (lippuarvot); setf (lippuarvot, peitearvot); unsetf (lippuarvot); 

Muuttuvat liput johdetaan OR-funktiota yhdessä kaikki haluamasi bitit |. Joten jos haluat tieteellinen, iso kirjain ja boolalpha käytä sitten tätä. Vain bitit siirrettiin sisään parametri ovat valmiina. Muut bitit jätetään ennallaan.

 cout.setf (ios_base:: tieteellinen | ios_base:: iso kirjain | ios_base:: boolalpha); cout << hex << endl; cout << 1234 << endl; cout << joulukuu << endl; cout << 123400003744.98765 << endl; bool arvo = tosi; cout << arvo << endl; cout.unsetf (ios_base:: boolalpha); cout << arvo << endl; 

tuottaa

 4D2. 1.234000E + 011. totta. 1. 

Peitebitit

Kaksi parametri setf-versio käyttää maskia. Jos bitti on asetettu sekä ensimmäiseen että toiseen parametriin, se asetetaan. Jos bitti on vain toisessa parametrissa, se tyhjennetään. Arvot säätökenttä, peruskenttä ja floatfield (lueteltu alla) ovat yhdistelmälippuja, toisin sanoen useita lippuja OR -toiminto yhdessä. varten basefield arvoilla 0x0e00 on sama kuin joulukuu | lokakuu | hex. Niin

 setf (ios_base:: hex, ios_basefield); 

tyhjentää kaikki kolme lippua ja asettaa sitten hex. samalla lailla adjustfield On vasen | oikein | sisäinen ja floatfield On tieteellinen | kiinteät.

Luettelo biteistä

Tämä luettelo enumeista on otettu Microsoft Visual C ++ 6.0: sta. Käytetyt todelliset arvot ovat mielivaltaisia ​​- toinen kääntäjä voi käyttää erilaisia ​​arvoja.

 skipws = 0x0001. yksikköbuf = 0x0002. iso kirjain = 0x0004. showbase = 0x0008. näyttöpiste = 0x0010. showpos = 0x0020. vasen = 0x0040. oikea = 0x0080. sisäinen = 0x0100. joulukuu = 0x0200. okt = 0x0400. heksa = 0x0800. tieteellinen = 0x1000. kiinteä = 0x2000. boolalpha = 0x4000. säätökenttä = 0x01c0. basefield = 0x0e00, floatfield = 0x3000. _Fmtmask = 0x7fff, _Fmtzero = 0. 

06

08

Tietoja Clogista ja Cerristä

Kuten cout, tukkia ja cerr ovat ennalta määritettyjä objekteja, jotka on määritetty ostreamissä. Iostream-luokka perii molemmilta ostream ja istream joten siksi cout esimerkkejä voidaan käyttää iostream.

Puskuroitu ja puskuroimaton

  • Puskuroitu - kaikki lähtö tallennetaan väliaikaisesti puskuri ja sitten pudotettiin seulomaan yhdellä kertaa. Sekä paholainen että tukkeuma puskuroidaan.
  • Puskuroimaton - Kaikki lähtö menee heti tulostuslaitteeseen. Esimerkki puskuroimattomasta esineestä on cerr.

Alla oleva esimerkki osoittaa, että cerria käytetään samalla tavalla kuin coutia.


#sisältää käyttämällä nimitilaa std; int _tmain (int argc, _TCHAR * argv []) {cerr.leveys (15); cerr.right; cerr << "Virhe" << endl; paluu 0; }

Puskuroinnin pääongelma on, jos ohjelmoida kaatuu, sitten puskurin sisältö katoaa, ja on vaikeampaa nähdä miksi se kaatui. Puskuroimaton tulostus on välitöntä, joten muutaman rivin tiputtaminen koodista voi olla hyödyllistä.

 cerr << "Vaarallisen toiminnon syöttäminen zappit" << endl; 

Kirjausongelma

Ohjelmatapahtumalokin rakentaminen voi olla hyödyllinen tapa havaita vaikeita virheitä - tyyppisiä, joita esiintyy vasta silloin tällöin. Jos kyseinen tapahtuma on kuitenkin kaatuminen, sinulla on ongelma - huuletko loki levylle jokaisen puhelun jälkeen, jotta näet tapahtumat aina kaatumiseen asti tai pidä sitä puskurissa ja huuhtele puskuri säännöllisin väliajoin ja toivon, ettet menetä liikaa, kun kaatuu tapahtuu?

07

08

Cin: n käyttö syöttöön: Alustettu sisääntulo

Tuloja on kahta tyyppiä.

  • Alustettu. Syötteen lukeminen numeroina tai tietyn tyyppisinä.
  • Alustamaton. Lukutavu tai jouset. Tämä antaa tulovirran huomattavasti paremman hallinnan.

Tässä on yksinkertainen esimerkki alustetusta syötöstä.

 // excin_1.cpp: Määrittää konsolisovelluksen tulopisteen. #include "stdafx.h" // vain Microsoft. #sisältää käyttämällä nimitilaa std; int main (int argc, char * argv []) { int a = 0; kelluva b = 0,0; int c = 0; cout << "Kirjoita int, kelluva ja int välilyönnillä erotettuna" <> a >> b >> c; cout << "Annoit" << a << "" << b << "" << c << endl; paluu 0; }

Tämä käyttää cinia lukemaan kolme numeroa (int, kellua, int) erotettu välilyönneillä. Sinun on painettava Enter-näppäintä numeron kirjoittamisen jälkeen.

3 7.2 3 näyttää "Syötte 3 7.2 3".

Alustetulla syötöllä on rajoituksia!

Jos syötät 3.76 5 8, saat arvon "Tulit 3 0.76 5", kaikki muut rivin arvot menetetään. Se käyttäytyy oikein, kuten. ei ole osa int: tä ja merkitsee siten kelluksen alkua.

Virhe jäljitettäessä

Cin-objekti asettaa epäonnistumisbitin, jos tuloa ei onnistuneesti muunnettu. Tämä bitti on osa iOS ja voidaan lukea Fail () toimivat molemmilla cin ja cout kuten tämä.

 if (cin.fail ()) // tee jotain. 

Yllätyksettömästi, cout.fail () asetetaan harvoin, ainakin näytön lähdössä. Myöhemmässä oppitunnissa tiedosto I / O: sta näemme kuinka cout.fail () voi tulla totta. Siellä on myös hyvä() toiminto cin, cout jne.