01
z 08
Nový spôsob výstupu

C ++ si zachováva veľmi vysokú spätnú kompatibilitu s C, tak
V predchádzajúcej lekcii sa to dotklo príkladom, ktorý používal Cout. Tu pôjdeme do trochu väčšej hĺbky, najskôr od výstupu, pretože má tendenciu byť viac využívané ako vstup.
Trieda iostream poskytuje prístup k objektom a metódam, ktoré potrebujete pre výstup aj vstup. Pomyslite na V / V, pokiaľ ide o toky bajtov - buď z vašej aplikácie do súboru, na obrazovku alebo do tlačiarne - to je výstup, alebo z klávesnice - to je vstup.
Výstup s Cout
Ak viete C, možno to viete << sa používa na posúvanie bitov doľava. Napr. 3 << 3 je 24. Napr. Posun vľavo zdvojnásobí hodnotu, takže 3 posuny vľavo ho vynásobia 8.
V jazyku C ++ << bola preťažený v ostreamovej triede tak int, plaváka typy reťazcov (a ich varianty - napr štvorhra) sú podporované. Takto postupujete pomocou textového reťazca spájaním viacerých položiek medzi <<.>
cout << "Some Text" << intvalue << floatdouble << endl;
Táto zvláštna syntax je možná, pretože každá z nich << je vlastne volanie funkcie, ktoré vracia a referencie na ostream objekt. Takýto riadok je v skutočnosti taký
<< („nejaký text“).
C funkcieprintf bol schopný formátovať výstup pomocou špecifikátorov formátu, napríklad% d. V C ++ môže Cout tiež formátovať výstup, ale používa iný spôsob, ako to urobiť.
02
z 08
Použitie Cout na formátovanie výstupu
Objektová vrstva je členom iostream knižnicu. Pamätajte, že toto musí byť súčasťou
#include
Táto knižnica iostream je odvodený z ostreae (pre výstup) a istream pre vstup.
formátovanie textového výstupu sa vykonáva vložením manipulátorov do výstupného toku.
Čo je manipulátor?
Je to funkcia, ktorá môže zmeniť vlastnosti výstupného (a vstupného) toku. Na predchádzajúcej stránke sme to videli << bola preťažená funkcia, ktorá vrátila odkaz na volajúci objekt, napr. cout pre výstup alebo cin pre vstup. Všetci manipulátori to robia, takže ich môžete zahrnúť do výstupu << alebo vstup >>. Pozrime sa na vstup a >> neskôr v tejto lekcii.
count << endl;
Endl je manipulátor, ktorý ukončí vedenie (a spustí nový). Je to funkcia, ktorú možno nazvať aj týmto spôsobom.
endl (cout);
V praxi by ste to však neurobili. Používate to takto.
cout << "Some Text" << endl << endl; // Dva prázdne riadky.
Súbory sú iba toky
Niečo na pamäti, že s veľkým rozvojom sa tieto dni konajú v roku GUI aplikácie, prečo by ste potrebovali textové V / V funkcie? Nie je to len pre konzola Aplikácia? Pravdepodobne budete robiť súbor I / O a môžete ich tam tiež použiť, ale tiež to, čo je výstupom na obrazovku, obyčajne potrebuje aj formátovanie. Toky sú veľmi flexibilným spôsobom manipulácie so vstupmi a výstupmi a môžu s nimi pracovať
- Text I / O. Rovnako ako v konzolových aplikáciách.
- Struny. Užitočné pre formátovanie.
- Súbor I / O.
Manipulátory opäť
Aj keď sme používali ostreae trieda, je odvodená trieda z ios trieda, ktorá pochádza z ios_base. Táto trieda predkov definuje verejnosť funkcie ktoré sú manipulátormi.
03
z 08
Zoznam pomocných manipulátorov
Manipulátory môžu byť definované vo vstupných alebo výstupných tokoch. Jedná sa o objekty, ktoré vracajú odkaz na objekt a sú umiestnené medzi pármi <<. Väčšina manipulátorov je prihlásená, ale Endl, konce a spláchnuť pochádzať z
Tu je podrobnejší zoznam.
z
- endl - Ukončí linku a vyprázdni hovor.
- končí - Vložené '\ 0' ( NULOVÝ) do prúdu.
- flush - Vynútenie okamžitého výstupu vyrovnávacej pamäte.
z . Väčšina z nich je vyhlásená v roku 2007
- boolalpha - Vložte alebo extrahujte boolové objekty ako „true“ alebo „false“.
- noboolalpha - Vložte alebo extrahujte boolovské objekty ako číselné hodnoty.
- fixed - Vložte hodnoty s pohyblivou rádovou čiarkou v pevnom formáte.
- Scientific - Vložte hodnoty s pohyblivou rádovou čiarkou vo vedeckom formáte.
- interné - interné odôvodnenie.
- doľava - zarovnanie doľava.
- doprava - zarovnanie napravo.
- dec - Vložte alebo extrahujte celé čísla v desiatkovom formáte.
- hex - Vložte alebo extrahujte celé hodnoty vo formáte hexadecimálny (základ 16).
- oct - Vložte alebo extrahujte hodnoty v osmičkovom formáte (základ 8).
- noshowbase - Nepredpisujte hodnotu s jej základňou.
- showbase - Hodnota predpony so základňou.
- noshowpoint - Nezobrazujte desatinnú čiarku, ak to nie je potrebné.
- showpoint - Pri vkladaní hodnôt s pohyblivou rádovou čiarkou vždy zobrazovať desatinnú čiarku.
- noshowpos - Nevkladajte znamienko plus (+), ak je číslo> = 0.
- showpos - Ak je číslo> = 0, vložte znamienko plus (+).
- noskipws - pri extrahovaní nevynechajte počiatočné medzery.
- skipws - Preskočenie počiatočného medzery pri extrahovaní.
- nouppercase - Nenahrádzajte malé písmená malými písmenami.
- veľké písmená - Nahraďte malé písmená malými písmenami.
- unitbuf - Vyprázdnenie vyrovnávacej pamäte po vložení.
- nounitbuf - Nevypláchnite medzipamäť po každom vložení.
04
z 08
Príklady použitia Cout
// ex2_2cpp. #include "stdafx.h" #includepomocou namespace std; int main (int arg, char * argv []) { šírka (10); cout << right << "Test" << endl; cout << vľavo << "Test 2" << endl; cout << interný << "Test 3" << endl; cout << endl; cout.precision (2); cout << 45,678 << endl; cout << veľké písmeno << "David" << endl; cout.precision (8); cout << Scientific << endl; cout << 450678762345.123 << endl; cout << pevná << 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:: veľké písmená); cout << hex << endl; cout << 1234 << endl; cout << okt. endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; návrat 0; }
Výstup z tohto je dole, s jedným alebo dvoma ďalšími riadkovými medzerami odstránenými kvôli prehľadnosti.
Test. Test 2. Test 3. 46. Dávid. 4.50678762E + 011. 450678762345.12299000. 0X4D2. 02322. +1234. 4D2. 2322. 1234.
Poznámka: David je napísaný veľkými písmenami ako David a nie DAVID. Je to preto, že veľké písmená ovplyvňujú iba generovaný výstup - napr. čísla vytlačené v hexadecimálne. Preto je hexadecimálny výstup 4d2 pri prevádzke veľkých písmen 4D2.
Väčšina z týchto manipulátorov tiež nastavila trochu zástavu a je možné ju nastaviť priamo
cout.setf ()
a vyčistite ho pomocou
cout.unsetf ()
05
z 08
Použitie Setf a Unsetf na manipuláciu s formátovaním I / O
Funkcia setf má dve preťažený verzie zobrazené nižšie. zatiaľ čo unsetf iba vymaže určené bity.
setf (flagvalues); setf (flagvalues, maskvalues); unsetf (flagvalues);
Variabilné príznaky sú odvodené z O krúžok dohromady všetky bity, ktoré chcete |. Takže ak chcete vedecké, veľké a boolalpha potom použite toto. Iba bity prešli ako parameter sú dané. Ostatné bity zostanú nezmenené.
cout.setf (ios_base:: vedecké | ios_base:: veľké písmená | ios_base:: boolalpha); cout << hex << endl; cout << 1234 << endl; cout << dec << endl; cout << 123400003744.98765 << endl; bool value = true; cout << hodnota << endl; cout.unsetf (ios_base:: boolalpha); cout << hodnota << endl;
produkuje
4D2. 1.234000E + 011. true. 1.
Maskovacie bity
Dva parameter verzia setf používa masku. Ak je bit nastavený v prvom aj druhom parametri, potom sa nastaví. Ak je bit iba v druhom parametri, vymaže sa. Hodnoty adjustfield, basefield a floatfield (uvedené nižšie) sú zložené príznaky, to znamená niekoľko príznakov Or'd dohromady. pre basefield s hodnotami 0x0e00 je to isté ako dec okt. | hex. tak
setf (ios_base:: hex, ios_basefield);
vymaže všetky tri príznaky a nastaví ich hex. podobne adjustfield je vľavo právo | interný a floatfield je vedecký fixné.
Zoznam bitov
Tento zoznam vymenovaných položiek je prevzatý z programu Microsoft Visual C ++ 6.0. Skutočne použité hodnoty sú ľubovoľné - iný kompilátor môže používať rôzne hodnoty.
skipws = 0x0001. unitbuf = 0x0002. veľké písmeno = 0x0004. showbase = 0x0008. showpoint = 0x0010. showpos = 0x0020. vľavo = 0x0040. vpravo = 0x0080. interné = 0x0100. dec = 0x0200. oct = 0x0400. hex = 0x0800. vedecký = 0x1000. opravené = 0x2000. boolalpha = 0x4000. adjustfield = 0x01c0. basefield = 0x0e00, floatfield = 0x3000. _Fmtmask = 0x7fff, _Fmtzero = 0.
06
z 08
O spoločnosti Clog and Cerr
Páči sa mi to cout, drevák a Cerro sú preddefinované objekty definované v ostream. Trieda iostream dedí obidve ostreae a istream takže to je dôvod, prečo cout príklady môžu byť použité iostream.
Vyrovnávacia pamäť a bez vyrovnávacej pamäte
- Vyrovnávacia pamäť - všetok výstup je dočasne uložený v priečinku a nárazník a potom narazil na obrazovku. Obe vrstvy aj upchávky sú pufrované.
- Unbuffered- Výstup sa okamžite presunie na výstupné zariadenie. Príkladom objektu bez vyrovnávacej pamäte je cerr.
Nasledujúci príklad ukazuje, že cerr sa používa rovnakým spôsobom ako Cout.
#include pomocou namespace std; int _tmain (int argc, _TCHAR * argv []) {šírka pásma (15); cerr.right; cerr << "Error" << endl; návrat 0; }
Hlavným problémom vyrovnávacej pamäte je to, že program havaruje, obsah vyrovnávacej pamäte sa stratí a je ťažké zistiť, prečo došlo k havárii. Výstup bez vyrovnávacej pamäte je okamžitý, a preto by bolo užitočné postrekovať niekoľko takýchto riadkov pomocou kódu.
cerr << "Zadanie nebezpečnej funkcie zappit" << endl;
Problém s protokolovaním
Vytvorenie protokolu udalostí programu môže byť užitočným spôsobom, ako zistiť ťažké chyby - typ, ktorý sa objavuje iba teraz a potom. Ak je táto udalosť zlyhaním, máte problém - vyplachujete denník na disk po každom hovore, aby ste videli udalosti až po haváriu alebo ju ponechajte vo vyrovnávacej pamäti a pravidelne preplachujte vyrovnávaciu pamäť a dúfajte, že pri havárii nestratíte príliš veľa vyskytuje?
07
z 08
Použitie Cin pre vstup: Formátovaný vstup
Existujú dva typy vstupu.
- Formátovať. Čítanie vstupu ako čísla alebo určitého typu.
- Neformátovaný. Čítanie bajtov alebo reťazce. To poskytuje oveľa väčšiu kontrolu nad vstupným tokom.
Toto je jednoduchý príklad formátovaného vstupu.
// excin_1.cpp: Definuje vstupný bod pre aplikáciu konzoly. #include "stdafx.h" // Iba spoločnosť Microsoft. #include pomocou namespace std; int main (int arg, char * argv []) { int a = 0; plavák b = 0,0; int c = 0; cout << "Zadajte int, float a int oddelené medzerami" <> a >> b >> c; cout << "Zadali ste" << a << "" << b << "" << c << endl; návrat 0; }
To používa cin na čítanie troch čísel (int, plavák, int) oddelené medzerami. Po zadaní čísla musíte stlačiť kláves Enter.
3 7,2 sa zobrazí „Zadali ste 3 7,2 3“.
Formátovaný vstup má obmedzenia!
Ak zadáte 3,76 5 8, zobrazí sa „Zadali ste 3 0,76 5“, všetky ostatné hodnoty na tomto riadku sa stratia. Správajú sa správne ako. nie je súčasťou int a preto označuje začiatok plaváka.
Chyba pri chybe
Objekt cin nastaví bit zlyhania, ak vstup nebol úspešne skonvertovaný. Tento bit je súčasťou ios a možno ich prečítať pomocou internetu Fail () fungujú na oboch cin a cout Páči sa ti to.
if (cin.fail ()) // niečo urobiť.
Niet divu, že cout.fail () je nastavená zriedka, aspoň na výstupe z obrazovky. V ďalšej lekcii o súbore I / O uvidíme ako cout.fail () sa môže stať skutočnosťou. K dispozícii je tiež dobrý () fungovať pre cin, cout atď.