01
din 08
Un nou drum spre ieșire

C ++ păstrează o compatibilitate inversă foarte mare cu C, deci
În lecția anterioară, acest lucru a fost atins cu un exemplu care a folosit cout. Aici vom intra într-o adâncime ceva mai mare începând cu ieșirea mai întâi, întrucât tinde să fie mai folosit decât intrarea.
Clasa iostream oferă acces la obiectele și metodele de care aveți nevoie atât pentru ieșire cât și pentru intrare. Gândiți-vă la i / o în ceea ce privește fluxurile de octeți - fie de la aplicația dvs. la un fișier, la ecran sau la o imprimantă - care este ieșire sau de la tastatură - aceasta este intrarea.
Ieșire cu Cout
Dacă știți C, este posibil să știți asta << este folosit pentru a muta biți spre stânga. De ex 3 << 3 este 24. De exemplu, deplasarea stângă dublează valoarea, astfel încât 3 schimburi stângi o înmulțesc cu 8
În C ++, << a fost supraîncărcat în clasa ostream astfel încât int, plutiși tipuri de șiruri (și variantele lor - de ex duble) sunt toate acceptate. Așa faceți ieșirea textului, alocând mai multe articole între <<.>
cout << "Some Text" << intvalue << floatdouble << endl;
Această sintaxă particulară este posibilă deoarece fiecare dintre << este de fapt un apel funcțional care returnează a referinţă la o ostreamă obiect. Deci, o linie precum cea de mai sus este de fapt așa
cout. << ("ceva text"). cout. << (intvalue) .cout. << (floatdouble) .cout. << (endl);
C funcţieprintf a fost capabil să formateze ieșirea folosind Specificații de format, cum ar fi% d. În C ++ cout poate de asemenea să formateze ieșirea, dar folosește un mod diferit de a o face.
02
din 08
Folosind Cout pentru formatarea rezultatului
Obiectul cout este un membru al iostream bibliotecă. Nu uitați că acest lucru trebuie inclus cu un
#include
Această bibliotecă iostream este derivat din ostream (pentru ieșire) și istream pentru intrare.
Formatarea de ieșire a textului se face prin inserarea manipulatorilor în fluxul de ieșire.
Ce este un manipulator?
Este o funcție care poate modifica caracteristicile fluxului de ieșire (și de intrare). Pe pagina anterioară am văzut asta << a fost o funcție supraîncărcată care a returnat o referință la obiectul apelant, de ex. cout pentru ieșire sau cin pentru intrare. Toți manipulatorii fac acest lucru, astfel încât să îi puteți include în ieșire << sau de intrare >>. Ne vom uita la intrare și >> mai târziu în această lecție.
numără << endl;
endl este un manipulator care încheie linia (și începe unul nou). Este o funcție care poate fi numită și în acest fel.
endl (cout);
Deși în practică nu ai face asta. O folosești așa.
cout << "Some Text" << endl << endl; // Două linii goale.
Fișierele sunt doar fluxuri
Ceva trebuie să țineți cont de faptul că în zilele noastre se dezvoltă multă dezvoltare GUI aplicații, de ce ai avea nevoie de funcții de I / O text? Nu este doar asta consolă aplicații? Ei bine, probabil că veți face I / O de fișiere și le puteți utiliza acolo, dar, de asemenea, ceea ce este de ieșire la ecran, de obicei, are nevoie de formatare. Fluxurile sunt un mod foarte flexibil de a gestiona intrarea și ieșirea și pot funcționa cu
- I / O de text. Ca și în aplicațiile consolei.
- Siruri de caractere. La îndemână pentru formatare.
- Fișier I / O.
Manipulatoare din nou
Deși am folosit ostream clasa, este o clasa derivată de la ios clasa care derivă din ios_base. Această clasă strămoșă definește publicul funcții care sunt manipulatori.
03
din 08
Lista manipulatoarelor Cout
Manipulatoarele pot fi definite în fluxuri de intrare sau ieșire. Acestea sunt obiecte care returnează o referință la obiect și sunt plasate între perechi de <<. Majoritatea manipulatorilor sunt declarați în, dar endl, capete și culoare vine din
Iată o listă mai detaliată.
Din
- endl - Încheie linia și apelează la culoare.
- se termină - se introduce „\ 0” ( NUL) în curent.
- flush - Forțați tamponul să fie emis imediat.
Din . Majoritatea sunt declarați în
- boolalpha - Introduceți sau extrageți obiecte bool ca „adevărate” sau „false”.
- noboolalpha - Inserați sau extrageți obiecte bool ca valori numerice.
- fix - Inserați valori în virgulă flotantă în format fix.
- științific - Inserați valori în virgulă flotantă în format științific.
- intern - Justificare internă.
- stânga - Stânga-justifica.
- right - Right-justify.
- dec - Inserați sau extrageți valori întregi în format zecimal.
- hex - Inserați sau extrageți valori întregi în format hexadecimal (bază 16).
- oct - Introduceți sau extrageți valorile în format octal (baza 8).
- noshowbase - Nu prefixați valoarea cu baza sa.
- showbase - Valoarea prefixului cu baza sa.
- noshowpoint - Nu arătați zecimale dacă nu este necesar.
- showpoint - Afișați întotdeauna punctul zecimal când introduceți valori în virgulă flotantă.
- noshowpos - Nu introduceți un semn plus (+) dacă numărul> = 0.
- showpos - Inserați semn plus (+) dacă numărul> = 0.
- noskipws - Nu săriți spațiul alb inițial la extragere.
- skipws - săriți spațiul alb inițial la extragere.
- nouppercase - Nu înlocuiți literele minuscule cu echivalente cu litere mari.
- cu majuscule - Înlocuiți literele minuscule cu echivalente majuscule.
- unitbuf - Spălați tamponul după o inserție.
- nounitbuf - Nu spălați tamponul după fiecare inserție.
04
din 08
Exemple folosind Cout
// ex2_2cpp. #includeți „stdafx.h” #includefolosirea spațiului de nume std; int main (int argc, char * argv []) { lărgime de cout (10); cout << dreapta << "Test" << endl; cout << stanga << "Test 2" << endl; cout << intern << "Test 3" << endl; cout << endl; cout.precision (2); cout << 45.678 << endl; cout << majuscule << "David" << endl; cout.precision (8); cout << stiintific << endl; cout << 450678762345.123 << endl; cout << fix << endl; cout << 450678762345.123 << endl; cout << showbase << endl; cout << showpos << endl; cout << hex << endl; cout << 1234 << endl; cout << oct << endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; cout << noshowbase << endl; cout << noshowpos << endl; cout.unsetf (ios:: majuscule); cout << hex << endl; cout << 1234 << endl; cout << oct << endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; returnare 0; }
Rezultatul este mai jos, cu unul sau două spații de linie suplimentare eliminate pentru claritate.
Test. Testul 2. Testul 3. 46. David. 4.50678762E + 011. 450678762345.12299000. 0X4D2. 02322. +1234. 4D2. 2322. 1234.
Notă: În ciuda literelor mari, David este tipărit ca David și nu DAVID. Acest lucru se datorează faptului că majuscule afectează numai producția generată - de ex. numere tipărite în hexazecimal. Deci, ieșirea hexagonală 4d2 este 4D2 atunci când funcționează cu majuscule.
De asemenea, majoritatea acestor manipulatori au setat un pic într-un steag și este posibil să setați acest lucru direct cu
cout.setf ()
și ștergeți-l cu
cout.unsetf ()
05
din 08
Utilizarea Setf și Unsetf pentru a manipula formatarea I / O
Functia setf Are doua supraîncărcat versiunile prezentate mai jos. In timp ce unsetf doar șterge biții specificați.
setf (flagvalues); setf (flagvalues, maskvalues); unsetf (flagvalues);
Steagurile variabile sunt derivate de Oring împreună toate bițiile cu care doriți | Deci, dacă vrei științific, cu majuscule și boolalfa apoi folosiți asta. Doar biții au trecut ca fiind parametru sunt aranjate. Celelalte biți sunt lăsate neschimbate.
cout.setf (ios_base:: științific | ios_base:: majuscule | ios_base:: boolalpha); cout << hex << endl; cout << 1234 << endl; cout << dec << endl; cout << 123400003744.98765 << endl; valoarea bool = adevărat; cout << valoare << endl; cout.unsetf (ios_base:: boolalpha); cout << valoare << endl;
produce
4D2. 1.234000E + 011. Adevărat. 1.
Bits de mascare
Cei doi parametru versiunea setf folosește o mască. Dacă bitul este setat atât în primul, cât și în al doilea parametru, atunci acesta va fi setat. Dacă bitul este doar în al doilea parametru, atunci acesta este șters. Valorile ajustfield, câmp de bază și floatfield (enumerate mai jos) sunt steaguri compuse, adică mai multe steaguri Or'd împreună. Pentru basefield cu valorile 0x0e00 este la fel ca dec | oct | hex. Asa de
setf (ios_base:: hex, ios_basefield);
șterge toate cele trei steaguri, apoi setează hex. asemănător adjustfield este stânga | corect | intern și floatfield este științific | fix.
Lista mușchilor
Această listă de enumere este preluată de la Microsoft Visual C ++ 6.0. Valorile reale utilizate sunt arbitrare - un alt compilator poate utiliza valori diferite.
skipws = 0x0001. unitbuf = 0x0002. cu majuscule = 0x0004. showbase = 0x0008. showpoint = 0x0010. showpos = 0x0020. stanga = 0x0040. dreapta = 0x0080. intern = 0x0100. dec = 0x0200. oct = 0x0400. hex = 0x0800. științific = 0x1000. fix = 0x2000. boolalpha = 0x4000. ajustfield = 0x01c0. câmp de bază = 0x0e00, floatfield = 0x3000. _Fmtmask = 0x7fff, _Fmtzero = 0.
06
din 08
Despre Clog și Cerr
Ca cout, înfunda și cerr sunt obiecte predefinite definite în ostream. Clasa iostream moștenește de la ambele ostream și istream deci de aceea cout se pot folosi exemple iostream.
Amestecat și nefăcut
- Amplasat - Toate ieșirile sunt stocate temporar într-un tampon apoi se aruncă la ecran pentru o dată. Atât cout-ul cât și înfundarea sunt tamponate.
- Neferită - Toate ieșirile se duc imediat la dispozitivul de ieșire. Un exemplu de obiect neaflat este cerr.
Exemplul de mai jos demonstrează că cerr este utilizat în același mod ca cout.
#include folosirea spațiului de nume std; int _tmain (int argc, _TCHAR * argv []) {cerr.width (15); cerr.right; cerr << "Eroare" << endl; returnare 0; }
Problema principală cu tamponarea este dacă program se blochează, atunci conținutul tamponului este pierdut și este mai greu de văzut de ce s-a prăbușit. Ieșirea neafectată este imediată, astfel încât stropirea câtorva linii de acest fel prin cod ar putea deveni utile.
cerr << "Intrarea funcției periculoase zappit" << endl;
Problema de jurnal
Construirea unui jurnal de evenimente de program poate fi o modalitate utilă de a detecta erori dificile - tipul care apare doar acum și atunci. Dacă acel eveniment este totuși un accident, aveți problema - nu vă aruncați jurnalul pe disc după fiecare apel, astfel încât să puteți vedea evenimente chiar până la prăbușire sau păstrați-l într-un tampon și spălați periodic tamponul și sper să nu pierdeți prea mult atunci când se produce blocarea apare?
07
din 08
Utilizarea Cin pentru intrare: intrare formatată
Există două tipuri de input.
- Formatted. Citirea intrării sub formă de numere sau de un anumit tip.
- Neformatat. Bytes de citire sau siruri de caractere. Acest lucru oferă un control mult mai mare asupra fluxului de intrare.
Iată un exemplu simplu de intrare formatată.
// excin_1.cpp: definește punctul de intrare pentru aplicația consolei. #include "stdafx.h" // Doar Microsoft. #include folosirea spațiului de nume std; int main (int argc, char * argv []) { int a = 0; float b = 0,0; int c = 0; cout << "Vă rugăm să introduceți o int, un float și o int separate prin spații" <> a >> b >> c; cout << "Ați introdus" << a << "" << b << "" << c << endl; returnare 0; }
Aceasta folosește cin pentru a citi trei numere (int, pluti, int) separate prin spații. După introducerea numărului, trebuie să apăsați Enter.
3 7.2 3 va ieși „Ați introdus 3 7.2 3”.
Intrarea formatată are limitări!
Dacă introduceți 3.76 5 8, primiți „Ați introdus 3 0.76 5”, toate celelalte valori de pe această linie se pierd. Aceasta se comportă corect, ca și. nu face parte din int și astfel marchează începutul plutitorului.
Eroare în capcarea
Obiectul cin setează un bit eșuat dacă intrarea nu a fost convertită cu succes. Acest bit face parte din ios și poate fi citit folosind Fail () funcționează pe ambele cin și cout asa.
if (cin.fail ()) // a face ceva.
Nu este surprinzator, cout.fail () este rar setat, cel puțin la ieșirea ecranului. Într-o lecție ulterioară cu privire la I / O fișier, vom vedea cum cout.fail () poate deveni adevărat. Este deasemenea o bun() funcționează pentru cin, cout etc.