C ++ oktatóprogram: Tudjon meg többet a be- és kimenetről

01

08-án

Új út a kimenethez

Program kód
traffic_analyzer / Getty Images

A C ++ nagyon magas visszamenőleges kompatibilitást tart fenn a C-vel, tehát beilleszthető, hogy hozzáférést biztosítson a printf () funkció a kimenethez. Ugyanakkor a C ++ által biztosított I / O szignifikánsan erősebb és fontosabb a típusbiztonság. Használhatja még scanf () a bemenethez, de a C ++ által biztosított biztonsági funkciók azt jelentik, hogy az alkalmazások robusztusabbak lesznek, ha a C ++ -ot használja.

Az előző leckében erre egy példát használtunk, amely cout-ot használt. Itt egy kicsit mélyebbre megyünk, először a kimenettel kezdve, mivel ez inkább használt, mint bemenet.

Az iostream osztály hozzáférést biztosít azokhoz az objektumokhoz és módszerekhez, amelyekre mind a kimenet, mind a bemenet szükséges. Gondolj az i / o -ra a bájtfolyam szempontjából - akár az alkalmazásból egy fájlba, a képernyőre vagy egy nyomtatóra - azaz a kimenetre, vagy a billentyűzetről - ez az input.

Kimenet a Cout-tal

Ha ismeri C-t, akkor ezt is tudja

instagram viewer
<< a bit balra tolására szolgál. Pl. 3 << 3 24. Például a bal oldali eltolás megkétszerezi az értéket, tehát a 3 bal eltolás megszorozza 8-zal.

A C ++, << volt túlterhelt az ostream osztályban, így int, úszó, és húrok típusai (és azok változatai, pl páros) mind támogatott. Így végezheti el a szövegkimenetet, több tétel összefűzésével a << között.


cout << "Néhány szöveg" << intézet << floatdouble << endl; 

Ez a sajátos szintaxis azért lehetséges, mert a << valójában egy függvényhívás, amely visszatér a referencia egy adatfolyamhoz tárgy. Tehát a fentiekhez hasonló vonal valójában ilyen


cout. << ("valamilyen szöveg"). cout. << (intézet) .cout. << (floatdouble) .cout. << (endl); 

A C funkcióprintf képes volt a kimenetet formázni olyan formátum-meghatározókkal, mint a% d. A C ++ esetén a cout formázhatja a kimenetet is, de más módon használja.

02

08-án

A Cout használata a kimenet formázásához

Az objektum cout tagja a iostream könyvtár. Ne feledje, hogy ezt bele kell foglalni a


#include 

Ez a könyvtár iostream származik ostream (a kimenethez) és istream_FAR bemenethez.

formázása A szövegkimenet egy része manipulátorok beillesztésével történik a kimeneti adatfolyamba.

Mi az a manipulátor?

Ez egy olyan funkció, amely megváltoztathatja a kimeneti (és bemeneti) adatfolyam tulajdonságait. Az előző oldalon láttuk ezt << egy túlterhelt függvény, amely visszaadta a hívó objektumra való hivatkozást, pl. cout a kimenethez vagy cin a bemenethez. Minden manipulátor ezt megteszi, így beillesztheti őket a kimenetbe << vagy input >>. Megvizsgáljuk a bemenetet és >> később ebben a leckében.


gróf << endl; 

Endl egy manipulátor, amely véget vet a sornak (és újat indít). Ez egy olyan funkció, amelyet így is meg lehet nevezni.


endl (cout); 

Bár a gyakorlatban ezt nem tenné meg. Így használod.


cout << "Néhány szöveg" << endl << endl; // Két üres sor. 

A fájlok csak patakok

Ne feledkezzen meg arról, hogy manapság sok fejlesztéssel zajlottak GUI alkalmazások, miért lenne szükség szöveges I / O funkciókra? Nem csak az konzol alkalmazások? Nos, valószínűleg fájl I / O fájlokat fog tenni, és ott is használhatja őket, de arra is, hogy mi lesz a képernyőre kimenet, általában formázást is igényel. A patakok a bemenetek és a kimenetek kezelésének nagyon rugalmas módjai, amelyekkel együtt tudnak dolgozni

  • Szöveg I / O. Mint a konzol alkalmazásokban.
  • Strings. Praktikus a formázáshoz.
  • I / O fájl.

Manipulátorok ismét

Bár a ostream osztály, ez egy származtatott osztály tól ios osztály, amely a ios_base. Ez az ősi osztály meghatározza a nyilvánosságot funkciók amelyek manipulátorok.

03

08-án

A Cout Manipulátorok listája

A manipulátorok bemeneti vagy kimeneti áramokban definiálhatók. Ezek olyan objektumok, amelyek visszaadnak egy hivatkozást az objektumra, és párjuk között vannak elhelyezve <<. A manipulátorok többségét, de Endl, véget ér és flush jönni valahonnan . Több manipulátor vesz egy paramétert, és ezek származnak .

Itt található egy részletesebb lista.

Tól től

  • endl - Vége a vonalnak, és hívások flösshöz.
  • vége - beszúrja a '\ 0' ( NULLA) a patakba.
  • flush - A puffer azonnali kiadására kényszerül.

Tól től . A legtöbbet 2006 - ban deklarálták az őse . Összeállítottam őket nem függvény, hanem ábécé alapján.

  • boolalpha - Helyezze be vagy bontsa ki a bool objektumokat "igaz" vagy "hamis" néven.
  • noboolalpha - Bool objektumok beillesztése vagy kibontása numerikus értékekként.
  • fix - a lebegőpontos értékek beillesztése rögzített formátumban.
  • tudományos - A lebegőpontos értékek beillesztése tudományos formátumba.
  • belső - belső indokolás.
  • balra - balra indokolja.
  • jobb - jobbra indokolni.
  • dec - egész érték beillesztése vagy kibontása decimális formátumban.
  • hex - egész érték beillesztése vagy kibontása hexadecimális (16. alap) formátumban.
  • oct - Az értékek beillesztése vagy kivonása oktális (8. alap) formátumban.
  • noshowbase - Ne állítson előtagot az alapjára.
  • showbase - Prefix érték az alapjával.
  • noshowpoint - Ne jelenjen meg tizedes pont, ha nem szükséges.
  • showpoint - mindig jelenjen meg a tizedes pont lebegőpontos értékek beillesztésekor.
  • noshowpos - Ne helyezzen be pluszjelet (+), ha a szám> = 0.
  • showpos - Ne illesszen be pluszjelet (+), ha szám> = 0.
  • noskipws - A kihúzáskor ne hagyja ki a kezdeti fehér helyet.
  • skipws - kihagyja a kezdeti fehér helyet a kinyeréskor.
  • nagybetű - ne cserélje a kisbetűket nagybetűkkel.
  • nagybetű - Cserélje ki a kisbetűket nagybetűs ekvivalensre.
  • unitbuf - öblítőpuffer beszúrása után.
  • nounitbuf - Ne öblítse ki a puffert minden egyes beszúrás után.

04

08-án

Példák a Cout használatára

// ex2_2cpp. #include "stdafx.h" #includenévtér std; int main (int argc, char * argv []) { szélesség (10); cout << jobb << "Teszt" << endl; cout << bal << "2. teszt" << endl; cout << belső << "3. teszt" << endl; cout << endl; cout.precision (2); cout << 45.678 << endl; cout << nagybetű << "David" << endl; cout.precision (8); cout << tudományos << endl; cout << 450678762345.123 << endl; cout << rögzített << endl; cout << 450678762345.123 << endl; cout << showbase << endl; cout << showpos << endl; cout << hex << endl; cout << 1234 << endl; cout << október << endl; cout << 1234 << endl; cout << december << endl; cout << 1234 << endl; cout << noshowbase << endl; cout << noshowpos << endl; cout.unsetf (ios:: nagybetűs); cout << hex << endl; cout << 1234 << endl; cout << október << endl; cout << 1234 << endl; cout << december << endl; cout << 1234 << endl; visszatérés 0; }

A kimenet az alábbiakban látható, egy vagy két extra sorköz eltávolítva az érthetőség kedvéért.

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

jegyzet: A nagybetűk ellenére Dávidot Davidnek, és nem Dávidnak nyomtatják. Ennek oka az, hogy a nagybetűk csak a generált kimenetet érintik - pl. számok nyomtatva hexadecimális. Tehát a 4d2 hexadecimális kimenete 4D2, amikor a nagybetűk működnek.

Ezen túlmenően a legtöbb ilyen manipulátor valójában egy kicsit beilleszt egy zászlóba, és ez közvetlenül beállítható

 cout.setf () 

és törölje le

 cout.unsetf () 

05

08-án

A Setf és az Unsetf használata az I / O formázás manipulálásához

A funkció setf kettő van túlterhelt alább bemutatott verziók. Míg unsetf csak törli a megadott biteket.

 setf (zászlóértékek); setf (zászlóértékek, maszkértékek); unsetf (zászlóértékek); 

A változó jelzőket a következő származtatja ORING együtt az összes kívánt bitet a |. Tehát, ha akarod tudományos, nagybetűs és boolalpha akkor használja ezt. Csak a bitek kerültek be paraméter vannak beállítva. A többi bit változatlan marad.

 cout.setf (ios_base:: tudományos | ios_base:: nagybetű | ios_base:: boolalpha); cout << hex << endl; cout << 1234 << endl; cout << december << endl; cout << 123400003744.98765 << endl; bool value = true; cout << érték << endl; cout.unsetf (ios_base:: boolalpha); cout << érték << endl; 

termel

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

Bitták

A két paraméter A setf verziója maszkot használ. Ha a bit be van állítva mind az első, mind a második paraméterben, akkor beállítva lesz. Ha a bit csak a második paraméterben van, akkor törlődik. Az értékek surefield, basefield és floatfield (alább felsorolva) összetett zászlók, vagyis több zászlók Or'd együtt. mert basefield az értékekkel 0x0e00 ugyanaz mint december | október | hex. Így

 setf (ios_base:: hex, ios_basefield); 

törli mind a három zászlót, majd beállítja hex. Hasonlóképpen adjustfield jelentése balra | jobb | belső és floatfield jelentése tudományos | rögzített.

Bitek listája

Az összegek ezen listája a Microsoft Visual C ++ 6.0-ból származik. A ténylegesen alkalmazott értékek önkényesek - egy másik fordító más értékeket is használhat.

 skipws = 0x0001. unitbuf = 0x0002. nagybetű = 0x0004. showbase = 0x0008. showpoint = 0x0010. showpos = 0x0020. balra = 0x0040. jobbra = 0x0080. belső = 0x0100. dec = 0x0200. okt = 0x0400. hex = 0x0800. tudományos = 0x1000. rögzített = 0x2000. boolalpha = 0x4000. beállító mező = 0x01c0. basefield = 0x0e00, floatfield = 0x3000. _Fmtmask = 0x7fff, _Fmtzero = 0. 

06

08-án

A Clogról és a Cerrről

Tetszik cout, klumpa és cerr előre definiált objektumok, amelyeket az ostream határoz meg. Az iostream osztály mindkettőtől örököl ostream és istream_FAR tehát ezért a cout a példák felhasználhatók iostream.

Pufferelt és nem pufferolt

  • Pufferelt - az összes kimenetet ideiglenesen a ütköző majd egy pillanatra átadják a szitáláshoz. A cout és az eltömődések is pufferelték.
  • Nem pufferolt - Az összes kimenet azonnal a kimeneti eszközre kerül. Egy nem pufferelt objektumra példa a cerr.

Az alábbi példa bemutatja, hogy a cerr-t ugyanolyan módon használják, mint a cout-ot.


#include névtér std; int _tmain (int argc, _TCHAR * argv []) {cerr szélesség (15); cerr.right; cerr << "Hiba" << endl; visszatérés 0; }

A pufferolás fő problémája az, ha program összeomlik, majd a puffer tartalma elveszik, és nehezebb megérteni, miért ütött össze. A nem pufferelt kimenet azonnali, így néhány sor ilyen permetezése a kódon keresztül hasznos lehet.

 cerr << "A veszélyes funkció bevitele a zappit" << endl; 

A naplózási probléma

A program eseménynaplójának elkészítése hasznos módszer lehet a nehéz hibák észlelésére - az ilyen típusú esetekben csak akkor fordul elő. Ha ez az esemény azonban összeomlik, akkor van a probléma: minden hívás után ki kell öblíteni a naplót a lemezre, hogy láthassa az eseményeket egészen a balesetig, vagy tartsa egy pufferben, és rendszeresen átöblítse a puffert, és remélem, hogy nem veszít túl sokat, amikor az összeomlik bekövetkezik?

07

08-án

Cin használata a bemenethez: formázott bemenet

Kétféle bemenet létezik.

  • Formázva. A bemenet olvasása számként vagy egy bizonyos típusúként.
  • Formázott. Olvasási bájt vagy húrok. Ez sokkal nagyobb ellenőrzést biztosít a bemeneti adatfolyam felett.

Itt van egy egyszerű példa a formázott bemenetre.

 // excin_1.cpp: meghatározza a konzol alkalmazás belépési pontját. #include "stdafx.h" // csak a Microsoft. #include névtér std; int main (int argc, char * argv []) { int a = 0; úszó b = 0,0; int c = 0; cout << "Kérjük, írjon be egy int, úszó és int szóközökkel elválasztva" <> a >> b >> c; cout << "Ön megadta a" << a << "" << b << "" << c << endl; visszatérés 0; }

Ez a cin segítségével három számot (int, úszó, int) szóközökkel elválasztva. A szám beírása után meg kell nyomnia az enter billentyűt.

3 7.2 3 megjeleníti a "Ön megadta a 3 7.2 3" értéket.

A formázott bemenetnek vannak korlátozásai!

Ha beírja a 3,76 5 8 értéket, akkor "Bevitt 3 0,76 5" értéket kap, az adott sor összes többi értéke elveszik. Ez helyesen viselkedik, mint a. nem része az int-nek, tehát jelzi az úszó kezdetét.

Hibacsapdás

A cin objektum beállít egy sikertelen bitet, ha a bemenetet nem sikerült konvertálni. Ez a bit része ios és olvasható a Fail () funkció mindkettőn cin és cout mint ez.

 if (cin.fail ()) // csinálj valamit. 

Nem meglepő módon, cout.fail () ritkán van beállítva, legalább a képernyő kimenetén. Egy későbbi leckében az I / O fájlról meglátjuk, hogyan cout.fail () valóra válhat. Itt van még a jó() funkció cin, cout stb.

instagram story viewer