Mielenkiintoista

Lisätietoja tuloista ja tuloista C ++: ssa

Lisätietoja tuloista ja tuloista C ++: ssa


We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.

1. tammikuuta 08

Uusi tapa tulostaa

traffic_analyzer / Getty Images

C ++ säilyttää erittäin korkean taaksepäin -yhteensopivuuden C: n kanssa, joten se 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 vähän syvemmälle aloittamalla lähtö ensin, koska sitä yleensä käytetään enemmän kuin tuloa.

Iostream-luokka tarjoaa pääsyn tarvitsemillesi objekteille 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 siirto kertoo sen 8: lla.

C ++: ssa << on ylikuormitettu ostream-luokassa niin, että int-, float- ja merkkijonotyyppejä (ja niiden variantteja - esim. tuplaa) tuetaan. 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 viitteen ostream-objektiin. Joten yllä oleva rivi on oikeastaan ​​tällainen

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

C-toiminto printf pystyi alustamaan tulosteen käyttämällä muotoilumääritteitä, kuten% d. C ++: ssa cout voi myös alustaa tulosteen, mutta käyttää erilaista tapaa tehdä se.

02of 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 muistettavaksi, miksi tarvitsisit tekstien I / O-toimintoja, jos GUI-sovelluksissa tehdään nykyään paljon kehitystä? Eikö se ole vain konsolisovelluksissa? 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 luokasta iOS luokka, joka perustuu ios_base. Tämä esi-ikäluokka määrittelee julkiset toiminnot, 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' (NULL) streamiin.
  • huuhtelu - Pakota puskuri ulostumaan välittömästi.

alkaen . Suurin osa on ilmoitettu. Olen ryhmitellyt ne funktion, ei aakkosten mukaan.

  • boolalpha - Lisää tai purka booliobjekteja "totta" tai "väärin".
  • noboolalpha - Lisää tai poimi booliobjektit numeroarvoina.
  • kiinteä - Lisää liukulukujen 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 (base 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 desimaalipiste kun lisätään liukulukuja.
  • noshowpos - Älä lisää plusmerkkiä (+), jos numero> = 0.
  • showpospos - Aseta plusmerkki (+), jos numero> = 0.
  • noskipws - Älä ohita ensimmäistä 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.
04of 08

Esimerkkejä Coutin käyttämisestä

// ex2_2cpp #include "stdafx.h" #lisäkäytä nimitilaa std; int main (int argc, char * argv) {leveysleveys (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ä.

Testiteste 2 Test 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 painettu heksadesimaalina. 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.8

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

Toiminto itsemuodostetun on kaksi ylikuormitettua versiota alla. Sillä aikaa unsetf vain tyhjentää määritetyt bitit.

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

Muuttuvat liput johdetaan OR-hakemalla kaikki haluamasi bitit yhteen |. Joten jos haluat tieteellinen, iso kirjain ja boolalpha käytä sitten tätä. Vain parametrina ohitetut bitit asetetaan. 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 tosi 1

Peitebitit

Setf: n kaksi parametriversiota 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, jotka olisivat 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. samoin 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 unitbuf = 0x0002 iso kirjain = 0x0004 showbase = 0x0008 näyttöpiste = 0x0010 showpos = 0x0020 left = 0x0040 right = 0x0080 internal = 0x0100 dec = 0x0200 oct = 0x0400 hex = 0x0800 tieteellinen = 0x1000 kenttä kiinteä = 0x2000 ala kiinteä = 0x2000 boo 0x0e00, kellukekenttä = 0x3000 _Fmtmask = 0x7fff, _Fmtzero = 006of 08

Tietoja Clogista ja Cerristä

Kuten cout, tukkia ja cerr ovat ennalta määritettyjä objekteja, jotka määritetään ostreamissa. 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 puskuriin ja sitten se tyhjennetään näytölle 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ällytä nimitilan käyttäminen std; int _tmain (int argc, _TCHAR * argv) {cerr.leveys (15); cerr.right; cerr << "Virhe" << endl; paluu 0; }

Puskuroinnin pääongelma on, että jos ohjelma kaatuu, puskurin sisältö katoaa, ja on vaikeampi 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 tapahtumia kaatumisesta saakka vai pitäisitkö sitä puskurissa ja huuhtelet määräajoin puskurin ja toivot, että et menettää liikaa, kun onnettomuus 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 merkkijono. Tämä antaa tulovirran huomattavasti paremman hallinnan.

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

// excin_1.cpp: Määrittää konsolisovelluksen tulopisteen. #sisältää "stdafx.h" // Vain Microsoft #tapaa käyttää 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 << "Olet kirjoittanut" << a << "" << b << "" << c << endl; paluu 0; }

Tämä käyttää cinia lukemaan kolme välilyönnillä erotettua numeroa (int, float, int). 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 virhebitin, 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.

08.8

Virhe jäljitettäessä muotoillussa syötössä

Tässä on esimerkki syöttösilmukasta, kunnes liukuluku on syötetty oikein.

// excin_2.cpp #include "stdafx.h" // Vain Microsoft #include nimiavaruus std; int main (int argc, char * argv) {kelluva floatnum; cout << "Kirjoita liukulukun numero:" <> floatnum)) {cin.clear (); cin.ignore (256, ' n'); cout << "Huono syöttö - Yritä uudelleen" << endl; } cout << "Olet kirjoittanut" << floatnum << endl; paluu 0; }asia selvä()jättää huomiotta

Huomautus: Tulo, kuten 654.56Y, luetaan kokonaan Y: ään asti, purkaa 654.56 ja poistuu silmukasta. Sitä pidetään kelvollisena syötteenä cin

Alustamaton syöttö

I / O-

Näppäimistö

cinTulla sisäänPalata

Tämä lopettaa oppitunnin.



Kommentit:

  1. Claiborne

    Luulen tekeväni virheitä. Pystyn todistamaan sen. Kirjoita minulle PM, se puhuu sinulle.

  2. Kazrataur

    Well done, this is the simply excellent idea

  3. Faushicage

    very real

  4. Arashilrajas

    Ehkä kieltäydyn))

  5. Cuartio

    Damn, guys, I spent the whole day on your site! Pts cool! True, my boss will probably ban this whole thing tomorrow (((((



Kirjoittaa viestin