01
08-án
Új út a kimenethez
A C ++ nagyon magas visszamenőleges kompatibilitást tart fenn a C-vel, tehát
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
<< 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
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
- 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.