Výuka C ++: Další informace o vstupu a výstupu

click fraud protection

01

z 08

Nový způsob výstupu

Programový kód
traffic_analyzer / Getty Images

C ++ udržuje velmi vysokou zpětnou kompatibilitu s C, tak mohou být zahrnuty, aby vám poskytly přístup k internetu printf () funkce pro výstup. I / O poskytované C ++ je však podstatně silnější a hlavně bezpečnější pro daný typ. Můžete také použít scanf () pro vstup, ale bezpečnostní funkce typu, které poskytuje C ++, znamenají, že vaše aplikace budou robustnější, pokud používáte C ++.

V předchozí lekci se toho dotkl příklad, který použil cout. Zde se nejprve podíváme na trochu hlouběji počínaje výstupem, protože má tendenci být více využívány než vstup.

Třída iostream poskytuje přístup k objektům a metodám, které potřebujete pro výstup i vstup. Přemýšlejte o V / V, pokud jde o toky bytů - buď z aplikace do souboru, na obrazovku nebo do tiskárny - to je výstup, nebo z klávesnice - to je vstup.

Výstup s Cout

Pokud znáte C, možná to víte << se používá k posunutí bitů doleva. Např. 3 << 3 je 24. Například posun doleva zdvojnásobí hodnotu, takže 3 posuny doleva ji násobí 8.

instagram viewer

V C ++ << byl přetížený ve třídě ostreamů tak int, plováka typy řetězců (a jejich varianty - např čtyřhra) jsou podporovány. Takto provádíte textový výstup tím, že spojíte více položek mezi <<.>


cout << "Nějaký text" << intvalue << floatdouble << endl; 

Tato zvláštní syntax je možná, protože každá z << je ve skutečnosti funkční volání, které vrací a odkaz na ostream objekt. Takže řádek jako výše je ve skutečnosti takový


cout. << ("nějaký text"). cout. << (intvalue) .cout. << (floatdouble) .cout. << (endl); 

C funkceprintf byl schopen formátovat výstup pomocí specifikátorů formátu, jako je například% d. V C ++ cout může také formátovat výstup, ale používá jiný způsob, jak to udělat.

02

z 08

Použití Cout k formátování výstupu

Objekt cout je členem iostream knihovna. Nezapomeňte, že toto musí být součástí


#zahrnout 

Tato knihovna iostream je odvozeno od ostream (pro výstup) a istream pro vstup.

Formátování textového výstupu se provádí vložením manipulátorů do výstupního proudu.

Co je manipulátor?

Je to funkce, která může změnit vlastnosti výstupního (a vstupního) proudu. Na předchozí stránce jsme to viděli << byla přetížená funkce, která vrátila odkaz na volající objekt, např. cout pro výstup nebo cin pro vstup. Všichni manipulátoři to dělají, abyste je mohli zahrnout do výstupu << nebo vstup >>. Podíváme se na vstup a >> později v této lekci.


count << endl; 

endl je manipulátor, který ukončí řádek (a spustí nový). Je to funkce, kterou lze také nazvat tímto způsobem.


endl (cout); 

I když v praxi byste to neudělali. Používáte to takto.


cout << "Nějaký text" << endl << endl; // Dva prázdné řádky. 

Soubory jsou jen proudy

Je třeba mít na paměti, že s velkým rozvojem se tyto dny dělají GUI aplikace, proč byste potřebovali textové I / O funkce? Není to jen pro řídicí panel aplikace? Pravděpodobně budete dělat soubor I / O a můžete je tam také použít, ale také to, co je výstupem na obrazovku, obvykle potřebuje také formátování. Proudy jsou velmi flexibilním způsobem zpracování vstupů a výstupů a mohou s nimi pracovat

  • Text I / O. Stejně jako v aplikacích konzoly.
  • Řetězce. Hodí se pro formátování.
  • Soubor I / O.

Manipulátory znovu

Ačkoli jsme používali ostream třída, to je odvozená třída z ios třída, která pochází z ios_base. Tato třída předků definuje veřejnost funkce které jsou manipulátory.

03

z 08

Seznam Cout manipulátorů

Manipulátory lze definovat ve vstupních nebo výstupních tokech. Jedná se o objekty, které vracejí odkaz na objekt a jsou umístěny mezi páry <<. Většina manipulátorů je deklarována, ale endl, končí a spláchnout pocházet z . Několik manipulátorů vezme jeden parametr a ty pocházejí .

Zde je podrobnější seznam.

Z

  • endl - Ukončí linku a volá flush.
  • končí - Vloží '\ 0' ( NULA) do proudu.
  • flush - Vynutit okamžitý výstup vyrovnávací paměti.

Z . Většina z nich je deklarována v roce 2007 předchůdce . Seskupil jsem je spíše podle funkce než podle abecedy.

  • boolalpha - Vložit nebo extrahovat bool objekty jako „true“ nebo „false“.
  • noboolalpha - Vloží nebo rozbalí bool objekty jako číselné hodnoty.
  • fixed - Vložení hodnot s pohyblivou řádovou čárkou v pevném formátu.
  • Scientific - Vložte hodnoty s pohyblivou řádovou čárkou ve vědeckém formátu.
  • interní - interní zarovnání.
  • doleva - zarovnání doleva.
  • right - Right-justify.
  • dec - Vložení nebo extrahování celých hodnot v desítkovém formátu.
  • hex - Vložení nebo extrahování celých hodnot ve formátu hexadecimální (základní 16).
  • oct - Vložení nebo extrahování hodnot v osmičkovém formátu (základní 8).
  • noshowbase - Nepředepisujte hodnotu s její základnou.
  • showbase - Hodnota předpony s její základnou.
  • noshowpoint - Nezobrazovat desetinná tečka, pokud to není nutné.
  • showpoint - Při vkládání hodnot s pohyblivou desetinnou čárkou vždy zobrazovat desetinná tečka.
  • noshowpos - Nevkládejte znaménko plus (+), pokud je číslo> = 0.
  • showpos - Vložte číslo plus (+), pokud je číslo> = 0.
  • noskipws - Při extrahování nevynechávejte počáteční mezeru.
  • skipws - Přeskočí počáteční prázdné místo při extrahování.
  • nouppercase - Nenahrazujte malá písmena ekvivalenty velkých písmen.
  • velká písmena - Nahrazujte malá písmena ekvivalenty velkých písmen.
  • unitbuf - Vyprázdnění vyrovnávací paměti po vložení.
  • nounitbuf - Nezaplachujte vyrovnávací paměť po každém vložení.

04

z 08

Příklady použití Cout

// ex2_2cpp. #include "stdafx.h" #zahrnoutpomocí oboru názvů std; int main (int argc, char * argv []) { šířka (10); cout << right << "Test" << endl; cout << vlevo << "Test 2" << endl; cout << interní << "Test 3" << endl; cout << endl; cout.precision (2); cout << 45,678 << endl; cout << velká písmena << "David" << endl; cout.precision (8); cout << Scientific << endl; cout << 450678762345.123 << endl; cout << opraveno << endl; cout << 450678762345.123 << endl; cout << showbase << endl; cout << showpos << endl; cout << hex << endl; cout << 1234 << endl; cout << říjen << endl; cout << 1234 << endl; cout << prosinec << endl; cout << 1234 << endl; cout << noshowbase << endl; cout << noshowpos << endl; cout.unsetf (ios:: velká písmena); cout << hex << endl; cout << 1234 << endl; cout << říjen << endl; cout << 1234 << endl; cout << prosinec << endl; cout << 1234 << endl; návrat 0; }

Výstup z tohoto je dole, s jedním nebo dvěma řádkovými mezerami odstraněnými pro přehlednost.

 Test. Test 2. Test 3. 46. Davide. 4,50678762E + 011. 450678762345.12299000. 0X4D2. 02322. +1234. 4d2. 2322. 1234. 

Poznámka: I přes velká písmena je David vytištěn jako David a ne DAVID. Je to proto, že velká písmena ovlivňují pouze generovaný výstup - např. čísla vytištěná v hexadecimální. Hexový výstup 4d2 je tedy 4D2, když je v provozu velká písmena.

Také většina z těchto manipulátorů ve skutečnosti nastavila trochu příznak a je to možné nastavit přímo pomocí

 cout.setf () 

a vyčistěte to pomocí

 cout.unsetf () 

05

z 08

Použití Setf a Unsetf k manipulaci s formátováním I / O

Funkce setf má dvě přetížený níže uvedené verze. Zatímco unsetf pouze vymaže určené bity.

 setf (flagvalues); setf (flagvalues, maskvalues); unsetf (flagvalues); 

Proměnné příznaky jsou odvozeny od ORing dohromady všechny kousky, které chcete |. Takže pokud chcete vědecké, velká písmena a boolalpha pak použijte toto. Pouze bity prošly jako parametr jsou nastaveny. Ostatní bity zůstávají nezměněny.

 cout.setf (ios_base:: vědecký | ios_base:: velká písmena | ios_base:: boolalpha); cout << hex << endl; cout << 1234 << endl; cout << prosinec << endl; cout << 123400003744.98765 << endl; bool value = true; cout << hodnota << endl; cout.unsetf (ios_base:: boolalpha); cout << hodnota << endl; 

Produkuje

 4D2. 1,234000E + 011. skutečný. 1. 

Maskovací bity

Dva parametr verze setf používá masku. Pokud je bit nastaven v prvním i druhém parametru, pak je nastaven. Pokud je bit pouze v druhém parametru, je vymazán. Hodnoty adjustfield, basefield a floatfield (jsou uvedeny níže) jsou složené příznaky, což je několik příznaků Nebo ano spolu. Pro basefield s hodnotami 0x0e00 je stejné jako prosinec | okt. | hex. Tak

 setf (ios_base:: hex, ios_basefield); 

vymaže všechny tři příznaky a poté nastaví hex. Podobně adjustfield je vlevo | vpravo | vnitřní a floatfield je vědecké | pevný.

Seznam bitů

Tento seznam výčtů je převzat z Microsoft Visual C ++ 6.0. Skutečné použité hodnoty jsou libovolné - jiný kompilátor může použít různé hodnoty.

 skipws = 0x0001. unitbuf = 0x0002. velká písmena = 0x0004. showbase = 0x0008. showpoint = 0x0010. showpos = 0x0020. left = 0x0040. right = 0x0080. interní = 0x0100. dec = 0x0200. oct = 0x0400. hex = 0x0800. vědecké = 0x1000. opraveno = 0x2000. boolalpha = 0x4000. adjustfield = 0x01c0. basefield = 0x0e00, floatfield = 0x3000. _Fmtmask = 0x7fff, _Fmtzero = 0. 

06

z 08

O společnosti Clog and Cerr

Jako cout, dřevák a cerr jsou předdefinované objekty definované v ostream. Třída iostream dědí od obou ostream a istream tak proto cout příklady mohou být použity iostream.

Buffered and Unbuffered

  • Vyrovnávací paměť - veškerý výstup je dočasně uložen v a pufr a pak najednou vyhodili na obrazovku. Jak cout, tak ucpání jsou vyrovnávací paměti.
  • Unbuffered - veškerý výstup přejde okamžitě na výstupní zařízení. Příkladem objektu bez vyrovnávací paměti je cerr.

Následující příklad ukazuje, že cerr se používá stejným způsobem jako cout.


#zahrnout pomocí oboru názvů std; int _tmain (int argc, _TCHAR * argv []) {cerr.width (15); cerr.right; cerr << "Error" << endl; návrat 0; }

Hlavní problém s ukládáním do vyrovnávací paměti je, pokud program dojde ke ztrátě obsahu vyrovnávací paměti a je těžší zjistit, proč došlo k selhání. Výstup bez vyrovnávací paměti je okamžitý, takže posypání několika takových řádků pomocí kódu by mohlo být užitečné.

 cerr << "Zadání nebezpečné funkce zappit" << endl; 

Problém protokolování

Vytváření protokolu programových událostí může být užitečným způsobem, jak odhalit obtížné chyby - typ, který se objevuje jen občas. Pokud se však jedná o selhání, máte problém - vyprázdníte protokol na disk po každém volání, abyste viděli události až do pádu nebo jej ponechte ve vyrovnávací paměti a periodicky propláchněte vyrovnávací paměť a doufejte, že při havárii příliš neztratíte dochází?

07

z 08

Použití Cin pro vstup: Formátovaný vstup

Existují dva typy vstupu.

  • Formátováno. Čtení vstupu jako čísla nebo určitého typu.
  • Neformátované. Čtení bytů nebo řetězce. To poskytuje mnohem větší kontrolu nad vstupním proudem.

Zde je jednoduchý příklad formátovaného vstupu.

 // excin_1.cpp: Definuje vstupní bod pro aplikaci konzoly. #include "stdafx.h" // Pouze Microsoft. #zahrnout pomocí oboru názvů std; int main (int argc, char * argv []) { int a = 0; float b = 0,0; int c = 0; cout << "Zadejte int, float a int oddělené mezerami" <> a >> b >> c; cout << "Zadali jste" << a << "" << b << "" << c << endl; návrat 0; }

Toto používá cin ke čtení tří čísel (int, plovák, int) odděleny mezerami. Po zadání čísla musíte stisknout klávesu Enter.

3 7,2 3 zobrazí „Zadali jste 3 7,2 3“.

Formátovaný vstup má omezení!

Pokud zadáte 3.76 5 8, zobrazí se „Zadali jste 3 0,76 5“, všechny ostatní hodnoty na tomto řádku se ztratí. To se chová správně jako. není součástí int a tak označuje začátek plováku.

Chyba soutisku

Objekt cin nastaví bit selhání, pokud nebyl vstup úspěšně převeden. Tento bit je součástí ios a lze je číst pomocí selhat() fungovat na obou cin a cout takhle.

 if (cin.fail ()) // něco udělat. 

Nepřekvapivě, cout.fail () je nastavena zřídka, alespoň na výstupu z obrazovky. V pozdější lekci k souboru I / O uvidíme jak cout.fail () se může stát pravdou. Je tam také dobrý() funkce pro cin, cout atd.

instagram story viewer