Vadnica za C ++: Spoznajte vnos in izhod

01

z dne 08

Nova pot do rezultata

Programska koda
traffic_analyzer / Getty slike

C ++ ohranja zelo visoko združljivost za nazaj s C, torej lahko vključite, da vam omogočimo dostop do printf () funkcija za izhod. Vendar je V / I, ki ga ponuja C ++, bistveno močnejši in še pomembnejši. Še vedno lahko uporabljate scanf () za vnos, vendar varnostne funkcije tipa, ki jih ponuja C ++, pomenijo, da bodo vaše aplikacije bolj robustne, če uporabljate C ++.

V prejšnji lekciji smo se tega dotaknili s primerom, ki je uporabil cout. Tu bomo šli v malo večjo globino, začenši najprej z izhodom, saj se ponavadi bolj uporablja kot vnos.

Razred iostream omogoča dostop do predmetov in metod, ki jih potrebujete za izhod in vhod. Pomislite na vhodne podatke v smislu pretokov bajtov - od vaše aplikacije do datoteke, zaslona ali tiskalnika - to je izhod ali s tipkovnice - to je vhod.

Izhod s Coutom

Če poznate C, lahko to veste << se uporablja za premikanje bitov v levo. Npr. 3 << 3 je 24. Npr. Premik v levo podvoji vrednost, zato jo 3 premika pomaknemo z 8.

instagram viewer

V C ++ << je bilo preobremenjen v razredu ostream, tako da int, lebdetiin vrste strun (in njihove različice - npr dvojice) so vsi podprti. Tako naredite izpis besedila z nizanjem več elementov med <<.>


cout << "Some Text" << intvalue << floatdouble << endl; 

Ta posebna skladnja je mogoča, ker je vsak od << je pravzaprav klic funkcije, ki vrne a sklic v potok objekt. Torej vrstica, kot je zgoraj, je pravzaprav taka


cout. << ("nekaj besedila"). cout. << (intvalue) .cout. << (floatdouble) .cout. << (endl); 

C funkcijoprintf je uspelo oblikovati izhod s pomočjo Specifikatorjev formata, kot je% d. V C ++ lahko cout tudi oblikuje izhod, vendar uporablja drugačen način.

02

z dne 08

Uporaba Cout-a za oblikovanje izhoda

Objektno cout je član iostream knjižnica. Ne pozabite, da mora biti to vključeno z


#include 

Ta knjižnica iostream izhaja iz ostream (za izhod) in istream za vnos.

Oblikovanje iznosa besedila se izvede z vstavitvijo manipulatorjev v izhodni tok.

Kaj je manipulator?

To je funkcija, ki lahko spremeni značilnosti izhodnega (in vhodnega) toka. Na prejšnji strani smo to videli << je bila preobremenjena funkcija, ki je vrnila sklic na klicni objekt, npr. cout za izhod ali cin za vnos. Vsi manipulatorji to storijo, tako da jih lahko vključite v izhod << ali vhod >>. Pogledali bomo vhod in >> kasneje v tej lekciji.


šteti << endl; 

endl je manipulator, ki konča črto (in začne novo). To je funkcija, ki jo lahko imenujemo tudi na ta način.


endl (cout); 

Čeprav v praksi tega ne bi storili. Uporabljate ga tako.


cout << "Nekaj ​​besedila" << endl << endl; // Dve prazni vrstici. 

Datoteke so samo tokovi

Nekaj ​​je treba upoštevati, da se v teh dneh veliko razvija GUI aplikacije, zakaj bi potrebovali besedilne V / I funkcije? Ali ni to samo za konzola aplikacije? No, verjetno boste naredili vhodno / izhodne datoteke in jih lahko uporabljate tudi tam, toda tudi tisto, kar je na zaslonu, običajno potrebuje tudi oblikovanje. Tok je zelo prilagodljiv način ravnanja z vhodom in izhodom in z njim je mogoče delovati

  • Besedilo V / I. Kot pri konzolah.
  • Strune. Priročno za oblikovanje.
  • Datoteka V / I.

Spet manipulatorji

Čeprav smo uporabljali ostream razred, je a izpeljani razred Iz ios razreda, ki izhaja iz ios_base. Ta razred prednikov opredeljuje javnost funkcije ki so manipulatorji.

03

z dne 08

Seznam manipulatorjev Cout

Manipulatorje lahko določite v vhodnih ali izhodnih tokovih. To so predmeti, ki vrnejo referenco na predmet in so postavljeni med pari <<. Večina manipulatorjev je prijavljena v, ampak endl, konci in zardevati prihajati . Več manipulatorjev vzame en parameter in ti prihajajo .

Tu je podrobnejši seznam.

Od

  • endl - Konča linijo in pokliče rdeče.
  • konci - Vstavi '\ 0' ( NIČ) v potok.
  • splakovanje - takoj izpustite pufer.

Od . Večina je prijavljena v prednik . Razvrstil sem jih po funkcijah in ne po abecedi.

  • boolalpha - Vstavite ali ekstrahirajte bool predmete kot "resnične" ali "napačne".
  • noboolalpha - Vstavite ali ekstrahirajte bool predmete kot številčne vrednosti.
  • fiksno - Vstavite vrednosti s plavajočo vejico v fiksni obliki.
  • znanstveno - Vstavite vrednosti s plavajočo vejico v znanstveno obliko.
  • notranja - Notranja utemeljitev.
  • levo - utemeljite levo.
  • pravica - upravičeno prav.
  • dec - Vstavite ali izvlecite celoštevilčne vrednosti v decimalni obliki.
  • hex - Vstavite ali izvlecite celoštevilčne vrednosti v šestnajstiški (osnovni 16) format.
  • okt - Vstavite ali izvlecite vrednosti v oktalni obliki (osnova 8).
  • noshowbase - Ne predpona s svojo osnovo.
  • showbase - vrednost predpone s svojo osnovo.
  • noshowpoint - po potrebi ne prikažite decimalne vejice.
  • showpoint - pri vstavljanju vrednosti s plavajočo vejico vedno prikažite decimalno točko.
  • noshowpos - Ne vstavite znaka plus (+), če je število> = 0.
  • showpos - Vstavite znak plus (+), če je število> = 0.
  • noskipws - Ne preskočite začetnega belega prostora pri ekstrakciji.
  • skipws - Preskočite začetni beli prostor pri ekstrakciji.
  • nouppercase - Ne nadomestite malih črk z velikimi velikimi črkami.
  • velika črka - nadomestite male črke z velikimi velikimi črkami.
  • unitbuf - Izpiranje medpomnilnika po vstavku.
  • nounitbuf - Po vsakem vstavku ne puščajte medpomnilnika.

04

z dne 08

Primeri uporabe Cout

// ex2_2cpp. #include "stdafx.h" #includez uporabo imenskega prostora std; int main (int argc, char * argv []) { cout.width (10); cout << right << "Test" << endl; cout << left << "Test 2" << endl; cout << notranji << "Test 3" << endl; cout << endl; natančnost cout (2); cout << 45.678 << endl; cout << velika črka << "David" << endl; natančnost cout (8); cout << znanstveni << endl; cout << 450678762345.123 << endl; cout << fiksno << endl; cout << 450678762345.123 << endl; cout << showbase << endl; cout << showpos << << endl; cout << hex << endl; cout << 1234 << endl; cout << okt << endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; cout << noshowbase << endl; cout << noshowpos << endl; cout.unsetf (ios:: velika črka); cout << hex << endl; cout << 1234 << endl; cout << okt << endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; vrne 0; }

Izhod iz tega je spodaj, z eno ali dvema dodatnima presledkoma za odstranitev jasnosti.

 Test. 2. test Test 3. 46. David 4.50678762E + 011. 450678762345.12299000. 0X4D2. 02322. +1234. 4d2. 2322. 1234. 

Opomba: Kljub velikim črkam je David natisnjen kot David in ne DAVID. To je zato, ker velika črka vpliva samo na ustvarjen izhod, npr. številke, natisnjene v šestnajstiški. Torej je šeststotni izhod 4d2 4D2, ko deluje velika črka.

Prav tako je večina teh manipulatorjev dejansko zastavljena v zastavi in ​​to je mogoče neposredno nastaviti

 cout.setf () 

in z njo počistite

 cout.unsetf () 

05

z dne 08

Uporaba Setf in Unsetf za manipuliranje V / I oblikovanja

Funkcija setf ima dva preobremenjen različice prikazane spodaj. Medtem unsetf samo počisti določene bite.

 setf (vrednosti zastave); setf (vrednosti zastave, maske); unsetf (vrednosti zastave); 

Spremenljive zastavice izhaja s ORing skupaj vse bite, ki jih želite z |. Torej, če želite znanstvene, velike črke in boolalpha nato pa uporabite to. Samo bitovi so bili preneseni kot parameter so nastavljeni. Ostali koščki ostanejo nespremenjeni.

 cout.setf (ios_base:: znanstveni | ios_base:: velika črka | ios_base:: boolalpha); cout << hex << endl; cout << 1234 << endl; cout << dec << endl; cout << 123400003744.98765 << endl; vrednost bool = res; cout << vrednost << endl; cout.unsetf (ios_base:: boolalpha); cout << vrednost << endl; 

Proizvaja

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

Maskiranje kosov

Dva parameter različica setf uporablja masko. Če je bit nastavljen v prvem in drugem parametru, potem se nastavi. Če je bit le v drugem parametru, potem je počiščen. Vrednosti prilagodljivo polje, osnovno polje in floatfield (navedene spodaj) so sestavljene zastave, to je več zastav Ali pa bi skupaj. Za osnovno polje z vrednostmi 0x0e00 je isto kot dec | okt | šesterokotni. Torej

 setf (ios_base: hex, ios_basefield); 

počisti vse tri zastavice in nato nastavi šesterokotni. podobno prilagodi polje je levo | prav | notranji in floatfield je znanstveni | fiksno.

Seznam bitov

Ta seznam je vpisan v Microsoft Visual C ++ 6.0. Dejanske uporabljene vrednosti so poljubne - drugi prevajalnik lahko uporablja različne vrednosti.

 skipws = 0x0001. unitbuf = 0x0002. velika črka = 0x0004. showbase = 0x0008. showpoint = 0x0010. showpos = 0x0020. levo = 0x0040. desno = 0x0080. notranji = 0x0100. dec = 0x0200. okt = 0x0400. hex = 0x0800. znanstveni = 0x1000. fiksno = 0x2000. boolalfa = 0x4000. prilagodi polje = 0x01c0. osnovno polje = 0x0e00, floatfield = 0x3000. _Fmtmask = 0x7fff, _Fmtzero = 0. 

06

z dne 08

O Clog in Cerr

Všeč cout, zamašiti in cerr so vnaprej določeni predmeti, definirani v ostreamu. Iostream razred podeduje od obeh ostream in istream zato je cout primeri lahko uporabimo iostream.

Zaščiteno in neobremenjeno

  • Zaščiten - ves izhod je začasno shranjen v blažilnik in nato z enim samim odstopanjem na zaslon. Tako puhasto kot zamašenost je puferno.
  • Nebufrirano - ves izhod se takoj vrne v izhodno napravo. Primer neobremenjenega predmeta je cerr.

Spodnji primer prikazuje, da se cerr uporablja na enak način kot cout.


#include z uporabo imenskega prostora std; int _tmain (int argc, _TCHAR * argv []) {cerr.width (15); cerr.right; cerr << "Napaka" << endl; vrne 0; }

Glavna težava pri pufranju je, če je program se zruši, nato se vsebina vmesnega pomnilnika izgubi in težje je razbrati, zakaj se je zrušila. Neprogramirani izhod je takojšen, zato lahko poškropite nekaj vrstic s pomočjo kode.

 cerr << "Vnos nevarne funkcije zappit" << endl; 

Težava z beleženjem

Izdelava dnevnika programskih dogodkov je lahko koristen način za odkrivanje težkih napak - takšnih, ki se pojavljajo samo tu in tam. Če je ta dogodek zrušen, imate težavo - ali po vsakem klicu izplačate dnevnik na disk, da boste lahko videli dogodke vse do zrušitve ali ga hranite v medpomnilniku in občasno izpirajte medpomnilnik in upam, da ob nesreči ne izgubite preveč se pojavi?

07

z dne 08

Uporaba Cin za vnos: oblikovani vnos

Obstajata dve vrsti vnosa.

  • Oblikovano Branje vnosa kot številke ali določene vrste.
  • Neoblikovan. Branje bajtov oz strune. To daje veliko večji nadzor nad vhodnim tokom.

Tu je preprost primer oblikovanega vnosa.

 // excin_1.cpp: Določi vstopno točko za konzolo. #include "stdafx.h" // Samo Microsoft. #include z uporabo imenskega prostora std; int main (int argc, char * argv []) { int a = 0; plovec b = 0,0; int c = 0; cout << "Prosimo, vnesite int, float in int, ločene s presledki" <> a >> b >> c; cout << "Vnesli ste" << a << "" << b << "" << c << endl; vrne 0; }

Ta uporablja cin za branje treh številk (int, lebdeti, int) ločeni s presledki. Po vnosu številke morate pritisniti enter.

3 7.2 3 se prikaže "Vnesli ste 3 7.2 3".

Oblika vnosa ima omejitve!

Če vnesete 3,76 5 8, dobite "Vnesli ste 3 0,76 5", vse druge vrednosti v tej vrstici so izgubljene. To se obnaša pravilno, kot. ni del int in tako označuje začetek plovca.

Napaka pri sledenju

Objekt cin nastavi bit neuspeha, če vhod ni bil uspešno pretvorjen. Ta košček je del ios in jih lahko preberete z uporabo ne () delujejo na obeh cin in cout Všečkaj to.

 če (cin.fail ()) // narediti nekaj. 

Ni presenetljivo, cout.fail () je redko nastavljen, vsaj na zaslonu. V kasnejši lekciji o datoteki V / I bomo videli kako cout.fail () lahko postane resnična. Obstaja tudi a dobro () funkcija za cin, cout itd.

instagram story viewer