01
od 08
Novi način za postizanje rezultata
C ++ zadržava vrlo visoku unatrag kompatibilnost s C, pa
U prethodnoj lekciji ovo se dotaknulo primjerom koji je koristio cout. Ovdje ćemo ući u malo veću dubinu, počevši s izlazom najprije jer ima tendenciju da se više koristi od ulaza.
Iostream klasa pruža pristup objektima i metodama koje su vam potrebne i za izlaz i za ulaz. Zamislite u / o u smislu tokova bajtova - bilo da idete od aplikacije do datoteke, ekrana ili pisača - to je izlaz ili s tipkovnice - to je ulaz.
Izlaz s Coutom
Ako znate C, to možda znate << koristi se za pomicanje bita ulijevo. Npr. 3 << 3 je 24. Npr. Pomak lijevo udvostručuje vrijednost, pa ga 3 pomjeranja lijevo množe s 8.
U C ++, << je preopterećen u ostream klasi tako da int, plutati, i vrste žice (i njihove inačice - npr dubl) svi su podržani. Ovo je način na koji se izvodi tekst spajanjem više stavki između <<.>
cout << "Neki tekst" << intvalue << floatdouble << endl;
Ova je osebujna sintaksa moguća jer je svaki od << zapravo je poziv funkcije koji vraća a upućivanje na ostream objekt. Dakle, linija poput gore zapravo je takva
cout. << ("neki tekst"). cout. << (intvalue) .cout. << (floatdouble) .cout. << (endl);
C funkcijaprintf bio je u mogućnosti formatirati izlaz pomoću Specifikatora formata, poput% d. Na C ++ coutu također se može oblikovati izlaz, ali se koristi drugačiji način rada.
02
od 08
Upotreba Cout-a za oblikovanje izlaza
Objektni cout je član iostream knjižnica. Ne zaboravite da ovo mora biti uključeno sa
#include
Ova knjižnica iostream potječe od ostream (za izlaz) i istream za unos.
oblikovanje iznosa teksta vrši se umetanjem manipulatora u izlazni tok.
Što je manipulator?
To je funkcija koja može promijeniti karakteristike izlaznog (i ulaza) toka. Na prethodnoj stranici to smo vidjeli << bila je preopterećena funkcija koja je vraćala referencu na pozivni objekt, npr. cout za izlaz ili cin za ulaz. To rade svi manipulatori kako biste ih mogli uključiti u izlaz << ili ulaza >>. Pogledat ćemo na ulaz i >> kasnije u ovoj lekciji.
računati << endl;
endl je manipulator koji završava liniju (i započinje novi). To je funkcija koja se također može nazvati na ovaj način.
endl (cout);
Iako u praksi to ne biste učinili. Koristite ga ovako.
cout << "Neki tekst" << endl << endl; // Dva prazna retka.
Datoteke su samo tokovi
Nešto za imati na umu da je s ovim razvojem ovih dana riječ mnogo GUI aplikacije, zašto bi vam trebale tekstualne I / O funkcije? Nije li to samo za konzola aplikacije? Pa, vjerojatno ćete napraviti datoteke I / O i možete ih koristiti tamo, ali i ono što se izlazi na zaslon obično treba i formatiranje. Struje su vrlo fleksibilan način rukovanja ulazima i izlazima i s njima se može raditi
- Tekst I / O. Kao i kod konzola.
- Žice. Prikladno za oblikovanje.
- Datoteka I / O.
Opet manipulatori
Iako smo koristili ostream klase, to je a izvedena klasa od iOS klase koja proizlazi iz ios_base. Ova klasa predaka definira javnost funkcije koji su manipulatori.
03
od 08
Popis Cout Manipulatori
Manipulatori se mogu definirati u ulaznim ili izlaznim strujama. To su objekti koji vraćaju referencu na objekt i smještaju se između parova <<. Većina manipulatora deklarirana je u sustavu, ali endl, krajevi i rumenilo doći od
Evo detaljnijeg popisa.
Iz
- endl - Završava liniju i poziva flush.
- krajevi - umetci '\ 0' ( NULL) u potok.
- ispiranje - prisilite da se tampon odmah izbaci.
Iz . Većina je deklarirana u
- boolalpha - Umetanje ili ekstrahiranje bool objekata kao "true" ili "false".
- noboolalpha - Umetanje ili vađenje bool objekata kao numeričkih vrijednosti.
- fiksno - umetnite vrijednosti s pomičnim zarezom u fiksnom formatu.
- znanstveni - umetnite vrijednosti s pomičnim zarezom u znanstveni format.
- unutarnja - unutarnja-opravdati.
- lijevo - lijevo-opravdati.
- ispravno - ispravno opravdati.
- dec - Umetanje ili izdvajanje cjelobrojnih vrijednosti u decimalnom obliku.
- hex - Umetanje ili ekstrahiranje cjelobrojnih vrijednosti u heksadecimalnom obliku (osnovni 16).
- oct - umetnite ili izvucite vrijednosti u oktalnom (osnovnom 8) formatu.
- noshowbase - Ne prefiksajte vrijednost s njegovom osnovom.
- showbase - vrijednost prefiksa s njegovom bazom.
- noshowpoint - Ne pokaži decimalnu točku ako nije potrebno.
- showpoint - Umetanje vrijednosti s pomičnim zarezom uvijek prikazuje decimalnu točku.
- noshowpos - Ne umetnite znak plus (+) ako je broj> = 0.
- showpos - umetnite znak plus (+) ako je broj> = 0.
- noskipws - Ne preskačite početni bijeli prostor prilikom vađenja.
- preskoči - Preskoči početni bijeli prostor prilikom vađenja.
- nouppercase - Nemojte zamjenjivati mala slova velikim slovima.
- velika slova - Zamijenite mala slova velikim ekvivalentima velikih slova.
- unitbuf - Isperite tampon nakon umetanja.
- nounitbuf - Ne ispirajte međuspremnik nakon svakog umetanja.
04
od 08
Primjeri pomoću Cout
// ex2_2cpp. #include "stdafx.h" #includepomoću namespace std; int main (int argc, char * argv []) { cout.width (10); cout << right << "Test" << endl; cout << lijevo << "Test 2" << endl; cout << unutarnji << "Test 3" << endl; cout << endl; cout.preciznost (2); cout << 45.678 << endl; cout << velika slova << "David" << endl; cout.preciznost (8); cout << znanstveni << endl; cout << 450678762345.123 << endl; cout << fiksni << 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 slova); cout << hex << endl; cout << 1234 << endl; cout << okt << endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; vratiti 0; }
Izlaz iz ovoga je ispod, s jednim ili dva dodatna razmaka reda radi jasnoće.
Test. Test 2. Test 3. 46. David. 4.50678762E + 011. 450678762345.12299000. 0X4D2. 02322. +1234. 4d2. 2322. 1234.
Bilješka: Unatoč velikim slovima, David je ispisan kao David, a ne DAVID. To je zato što velika slova utječu samo na generirani izlaz - npr. brojevi ispisani u heksadecimalni. Dakle, šesterokutni izlaz 4d2 je 4D2 kada se rade velika slova.
Također, većina ovih manipulatora zapravo postavlja malo u zastavu i moguće je ovo izravno postaviti
cout.setf ()
i to očistite sa
cout.unsetf ()
05
od 08
Upotreba Setf i Unsetf za manipuliranje I / O oblikovanjem
Funkcija setf ima dvije preopterećen verzije prikazane u nastavku. Dok unsetf samo briše navedene bitove.
setf (vrijednosti zastave); setf (vrijednosti zastave, maske); unsetf (zastavne vrijednosti);
Promjenjive zastave su izvedene pomoću O-prsten zajedno sve bitove koje želite s |. Dakle, ako želite znanstveni, velika slova i boolalpha onda iskoristite ovo. Samo su bitovi proslijeđeni kao parametar postavljeni su. Ostali zalogaji ostaju nepromijenjeni.
cout.setf (ios_base: znanstveni | ios_base: velika slova | ios_base:: boolalpha); cout << hex << endl; cout << 1234 << endl; cout << dec << endl; cout << 123400003744.98765 << endl; vrijednost bool = istina; cout << vrijednost << endl; cout.unsetf (ios_base:: boolalpha); cout << vrijednost << endl;
proizvodi
4D2. 1.234000E + 011. pravi. 1.
Maskiranje dijelova
Dva parametar inačica setf koristi masku. Ako je bit postavljen u prvom i drugom parametru, tada se postavlja. Ako je bit samo u drugom parametru, onda se briše. Vrijednosti prilagodno polje, osnovno polje i floatfield (navedene dolje) su složene zastave, to jest nekoliko zastava odvojeni riječju zajedno. Za basefield s vrijednostima 0x0e00 isto je kao dec | okt | hex. Tako
setf (ios_base: hex, ios_basefield);
briše sve tri zastave i zatim postavlja hex. slično adjustfield je lijevo | pravo | interni i floatfield je znanstveni | fiksna.
Popis bitova
Ovaj popis enuma preuzet je s Microsofta Visual C ++ 6.0. Stvarne korištene vrijednosti su proizvoljne - drugi sastavljač može koristiti različite vrijednosti.
preskoči = 0x0001. unitbuf = 0x0002. velika slova = 0x0004. showbase = 0x0008. showpoint = 0x0010. showpos = 0x0020. lijevo = 0x0040. desno = 0x0080. unutarnji = 0x0100. dec = 0x0200. okt = 0x0400. šesterokut = 0x0800. znanstveni = 0x1000. fiksno = 0x2000. boolalpha = 0x4000. prilagodi polje = 0x01c0. osnovno polje = 0x0e00, floatfield = 0x3000. _Fmtmask = 0x7fff, _Fmtzero = 0.
06
od 08
O klopu i Cerru
Kao cout, začepiti i cerr su unaprijed definirani objekti definirani u ostreamu. Iostream klasa nasljeđuje obje ostream i istream pa je zato cout primjeri mogu koristiti iostream.
Buferirano i nebuferirano
- Puferirano - sav se izlaz privremeno pohranjuje u pufer a onda je u jednom potezu bacili na zaslon. Pupak i začepljenje su puferirani.
- Nebuferirano - sav izlaz odmah ide na izlazni uređaj. Primjer nebuferiranog objekta je cerr.
Primjer u nastavku pokazuje da se cerr koristi na isti način kao i cout.
#include pomoću namespace std; int _tmain (int argc, _TCHAR * argv []) {cerr.width (15); cerr.right; cerr << "Pogreška" << endl; vratiti 0; }
Glavni problem puferiranja je ako program ruši, tada se sadržaj međuspremnika gubi i teže je vidjeti zašto se srušio. Neblokirani izlaz je odmah tako da bi poškropljenje nekoliko redaka poput ovog moglo biti korisno.
cerr << "Unos opasne funkcije zappit" << endl;
Problem s evidentiranjem
Izgradnja dnevnika programskih događaja može biti koristan način za otkrivanje teških pogrešaka - tipa koji se pojavljuju samo ponekad i kasnije. Ako se ipak dogodi pad sustava, imate problem - ispuštate li zapisnik na disk nakon svakog poziva kako biste mogli vidjeti događaje sve do rušenja ili ga držite u međuspremniku i povremeno ga ispirajte te se nadam da nećete izgubiti previše nakon pada. događa?
07
od 08
Korištenje Cin za unos: oblikovani unos
Postoje dvije vrste unosa.
- Formatirana. Čitanje unosa kao brojeva ili određene vrste.
- Neformatirani. Čitanje bajtova ili žice. To daje mnogo veću kontrolu nad ulaznim tokom.
Evo jednostavnog primjera formatiranog unosa.
// excin_1.cpp: Definira ulaznu točku za konzolu. #include "stdafx.h" // Samo Microsoft. #include pomoću namespace std; int main (int argc, char * argv []) { int a = 0; plutaj b = 0,0; int c = 0; cout << "Unesite int, float i int razdvojene razmacima" <> a >> b >> c; cout << "Uneli ste" << a << "" << b << "" << c << endl; vratiti 0; }
Koristi cin za čitanje tri broja (int, plutati, int) odvojeni razmacima. Nakon upisivanja broja morate pritisnuti enter.
3 7.2 3 prikazat će se "Uneli ste 3 7,2 3".
Formatirani unos ima ograničenja!
Ako unesete 3,76 5 8, dobijete "Uneli ste 3 0,76 5", sve ostale vrijednosti na toj liniji gube se. To se ponaša ispravno, kao. nije dio inta i tako označava početak plovka.
Pogreška u zamci
Cin objekt postavlja bit neuspjeha ako ulaz nije uspješno pretvoren. Ovaj dio je dio iOS i može se čitati upotrebom iznevjeriti() funkcioniraju na obje CIN i cout kao ovo.
ako (cin.fail ()) // učiniti nešto.
Nije iznenađujuće cout.fail () rijetko je postavljen, barem na zaslonu. U kasnijoj lekciji datoteke I / O vidjet ćemo kako cout.fail () može postati istina. Tu je i dobro() funkcija za CIN, cout itd