Vodič za C ++: Saznajte više o unosu i izlazu

01

od 08

Novi način za postizanje rezultata

Programski kod
traffic_analyzer / Getty slike

C ++ zadržava vrlo visoku unatrag kompatibilnost s C, pa mogu biti uključeni kako bi vam dali pristup printf () funkcija za izlaz. Međutim, I / O koje nudi C ++ je značajno snažniji i još važnije, siguran je tip. Još uvijek možete koristiti scanf () za unos, ali vrste sigurnosnih značajki koje pruža C ++ znači da će vam aplikacije biti robusnije ako koristite C ++.

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.

instagram viewer

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 . Nekoliko manipulatora uzima jedan parametar, a ovi potječu .

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 predak od . Grupirao sam ih prema funkcijama, a ne abecedno.

  • 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

instagram story viewer