C ++ Tutorial: Lær om input og output

click fraud protection

01

af 08

En ny måde at output på

Programkode
traffic_analyzer / Getty Images

C ++ bevarer meget høj bagudkompatibilitet med C, så kan inkluderes for at give dig adgang til printf () funktion til output. Imidlertid er I / O, der leveres af C ++, betydeligt mere kraftfuld og vigtigere type sikker. Du kan stadig også bruge scanf () til input, men de type sikkerhedsfunktioner, som C ++ leverer, betyder, at dine applikationer vil være mere robuste, hvis du bruger C ++.

I den foregående lektion blev dette berørt med et eksempel, der brugte cout. Her vil vi gå ind i en lidt mere dybde startende med output først, da det har tendens til at blive mere brugt end input.

Iiostream-klassen giver adgang til de objekter og metoder, du har brug for både output og input. Tænk på i / o med hensyn til strømme af bytes - enten at gå fra din applikation til en fil, skærmen eller en printer - der udsendes eller fra tastaturet - der er input.

Output med Cout

Hvis du kender C, ved du måske det << bruges til at skifte bits til venstre. F.eks. 3 << 3 er 24. F.eks. Fordobler venstre skift værdien, så 3 venstre skift ganges med 8.

instagram viewer

I C ++ << har været overbelastet i ostream-klassen, så det int, flyde, og strengstyper (og deres varianter - f.eks double) understøttes alle. Dette er, hvordan du udskriver tekst ved at stringere flere elementer mellem <<.>


cout << "Nogle tekster" << intvalue << floatdouble << endl; 

Denne specielle syntaks er mulig, fordi hver af << er faktisk et funktionsopkald, der returnerer a reference til en ostream objekt. Så en linje som ovenstående er faktisk sådan


cout. << ("noget tekst"). cout. << (intvalue) .cout. << (floatdouble) .cout. << (endl); 

C fungereprintf var i stand til at formatere output ved hjælp af Format Specifiers såsom% d. I C ++ kan cout også formatere output, men bruger en anden måde at gøre det på.

02

af 08

Brug af Cout til at formatere output

Objektet cout er medlem af iostream bibliotek. Husk, at dette skal inkluderes i en


#omfatte 

Dette bibliotek iostream stammer fra ostream (for output) og istream til input.

Formatering af tekstoutput udføres ved at indsætte manipulatorer i outputstrømmen.

Hvad er en manipulator?

Det er en funktion, der kan ændre egenskaberne for output (og input) strømmen. På den forrige side så vi det << var en overbelastet funktion, der returnerede en henvisning til det kaldende objekt f.eks. cout for output eller cin for input. Alle manipulatorer gør dette, så du kan inkludere dem i output << eller input >>. Vi vil se på input og >> senere i denne lektion.


tæller << endl; 

endl er en manipulator, der afslutter linjen (og starter en ny). Det er en funktion, der også kan kaldes på denne måde.


endl (cout); 

Selvom du i praksis ikke ville gøre det. Du bruger det sådan her.


cout << "Noget tekst" << endl << endl; // To blanke linjer. 

Filer er bare strømme

Noget at huske på, at med meget udvikling i disse dage gøres i GUI applikationer, hvorfor har du brug for tekst I / O-funktioner? Er det ikke kun for konsol applikationer? Nå, du vil sandsynligvis gøre fil I / O, og du kan også bruge dem der, men også hvad der udsendes til skærmen er normalt også nødvendigt at formatere. Streams er en meget fleksibel måde at håndtere input og output på og kan arbejde med

  • Tekst I / O. Som i konsolapplikationer.
  • Strings. Praktisk til formatering.
  • Fil I / O.

Manipulatorer igen

Selvom vi har brugt ostream klasse, det er en afledt klasse fra ios klasse, der stammer fra ios_base. Denne forfaderklasse definerer offentligheden funktioner som er manipulatorer.

03

af 08

Liste over Cout-manipulatorer

Manipulatorer kan defineres i input- eller output-streams. Dette er objekter, der returnerer en henvisning til objektet og placeres mellem par af <<. De fleste af manipulatorerne er erklæret i, men endl, ender og Flush kommer fra . Flere manipulatorer tager en parameter, og disse kommer fra .

Her er en mere detaljeret liste.

Fra

  • endl - Slutter linjen og ringer direkte.
  • slutter - Indsætter '\ 0' ( NUL) i strømmen.
  • flush - Tving bufferen til at blive sendt med det samme.

Fra . De fleste er erklæret i stamfar til . Jeg har grupperet dem efter funktion snarere end alfabetisk.

  • boolalpha - Indsæt eller ekstraher bool-objekter som "sandt" eller "falskt".
  • noboolalpha - Indsæt eller ekstraher bool-objekter som numeriske værdier.
  • fast - Indsæt flydepunktværdier i fast format.
  • videnskabelig - Indsæt flydepunktværdier i videnskabeligt format.
  • intern - Internt-begrunde.
  • venstre - Venstre-retfærdiggøre.
  • højre - retfærdiggøre.
  • dec - Indsæt eller ekstraher heltalværdier i decimalformat.
  • hex - Indsæt eller ekstraher heltalværdier i hexadecimal (base 16) format.
  • oct - Indsæt eller ekstraher værdier i oktalt (base 8) format.
  • noshowbase - Foretruk ikke værdien med dens base.
  • showbase - Præfiksværdi med dens base.
  • noshowpoint - Vis ikke decimal, hvis ikke nødvendigt.
  • showpoint - Vis altid decimalpunkt, når du indsætter flydende punktværdier.
  • noshowpos - Indsæt ikke plustegn (+) hvis nummer> = 0.
  • showpos - Indsæt plustegn (+) hvis nummer> = 0.
  • noskipws - Spring ikke over den oprindelige hvide plads ved udtrækning.
  • skipws - Spring over den hvide plads ved udtrækning.
  • nouppercase - Udskift ikke små bogstaver med store bogstaver.
  • store bogstaver - Erstat små bogstaver med store bogstaver.
  • unitbuf - Skyl buffer efter en indsats.
  • nounitbuf - Skyl ikke buffer efter hver indsætning.

04

af 08

Eksempler ved hjælp af Cout

// ex2_2cpp. #include "stdafx.h" #omfatteved hjælp af navneområde std; int main (int argc, char * argv []) { cout.width (10); cout << til højre << "Test" << endl; cout << tilbage << "Test 2" << endl; cout << intern << "Test 3" << endl; cout << endl; cout.precision (2); cout << 45.678 << endl; cout << store bogstaver << "David" << endl; cout.precision (8); cout << videnskabelig << endl; << 450678762345.123 << endl; cout << fast << endl; << 450678762345.123 << endl; cout << showbase << endl; cout << showpos << endl; cout << hex << endl; cout << 1234 << endl; cout << oktober << endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; cout << noshowbase << endl; cout << noshowpos << endl; cout.unsetf (ios:: store bogstaver); cout << hex << endl; cout << 1234 << endl; cout << oktober << endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; retur 0; }

Outputet fra dette er nedenfor, med et eller to ekstra linjerum fjernet for at skabe klarhed.

 Prøve. Test 2. Test 3. 46. David. 4.50678762E + 011. 450678762345.12299000. 0X4D2. 02322. +1234. 4d2. 2322. 1234. 

Bemærk: På trods af store bogstaver udskrives David som David og ikke DAVID. Dette skyldes, at store bogstaver kun påvirker genereret output - f.eks. numre trykt i hexadecimal. Så hexoutput 4d2 er 4D2, når store bogstaver er i drift.

Også de fleste af disse manipulatorer satte faktisk en smule i et flag, og det er muligt at indstille dette direkte med

 cout.setf () 

og ryd det med

 cout.unsetf () 

05

af 08

Brug af Setf og Unsetf til at manipulere I / O-formatering

Funktionen setf har to overbelastet versionerne vist nedenfor. Mens unsetf bare rydder de specificerede bits.

 setf (flagværdier); setf (flagværdier, maskeværdier); unsetf (flagværdier); 

De variable flag er afledt af O ring sammen alle de bits, du ønsker med |. Så hvis du vil videnskabelig, stor bogstav og boolalpha så brug dette. Kun bitene gik ind som parameter er indstillet. De andre bits forbliver uændrede.

 cout.setf (ios_base:: videnskabelig | ios_base:: store bogstaver | ios_base:: boolalpha); cout << hex << endl; cout << 1234 << endl; cout << dec << endl; cout << 123400003744.98765 << endl; bool værdi = sand; cout << værdi << endl; cout.unsetf (ios_base:: boolalpha); cout << værdi << endl; 

producerer

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

Maskeringsbits

De to parameter version af setf bruger en maske. Hvis biten er indstillet i både den første og den anden parameter, bliver den indstillet. Hvis biten kun er i den anden parameter, slettes den. Værdierne justeringsfelt, basefelt og floatfield (anført nedenfor) er sammensatte flag, det vil sige flere flag Or'd sammen. Til basefield med værdierne 0x0e00 er det samme som dec | okt | hex. Så

 setf (ios_base:: hex, ios_basefield); 

rydder alle tre flag derefter sætter hex. Tilsvarende adjustfield er venstre | ret | indre og floatfield er videnskabelig | fast.

Liste over bits

Denne liste over enum er hentet fra Microsoft Visual C ++ 6.0. De faktiske anvendte værdier er vilkårlige - en anden kompilator kan bruge forskellige værdier.

 skipws = 0x0001. unitbuf = 0x0002. store bogstaver = 0x0004. showbase = 0x0008. showpoint = 0x0010. showpos = 0x0020. venstre = 0x0040. højre = 0x0080. internt = 0x0100. dec = 0x0200. okt = 0x0400. hex = 0x0800. videnskabelig = 0x1000. fast = 0x2000. boolalpha = 0x4000. justeringsfelt = 0x01c0. basefelt = 0x0e00, floatfield = 0x3000. _Fmtmask = 0x7fff, _Fmtzero = 0. 

06

af 08

Om Clog og Cerr

Synes godt om cout, træsko og cerr er foruddefinerede objekter defineret i ostream. Istream-klassen arver fra begge ostream og istream så det er grunden til cout eksempler kan bruge iostream.

Bufret og ikke-bufret

  • Bufret - Al output gemmes midlertidigt i a puffer og derefter dumpet til skærmen på én gang. Både cout og tilstopning er bufret.
  • Ubuffet - Alt output går straks til outputenheden. Et eksempel på et ubuffet objekt er cerr.

Eksemplet nedenfor viser, at cerr bruges på samme måde som cout.


#omfatte ved hjælp af navneområde std; int _tmain (int argc, _TCHAR * argv []) {cerr. bredde (15); cerr.right; cerr << "Fejl" << endl; retur 0; }

Det største problem med buffering er, hvis program går ned, går buffertindholdet tabt, og det er sværere at se, hvorfor det styrtede. Ubufret output er øjeblikkeligt, så sprinkling af et par linjer som denne gennem koden kan komme til nytte.

 cerr << "Indtastning af farlig funktion zappit" << endl; 

Logproblemet

Opbygning af en log over programbegivenheder kan være en nyttig måde at få øje på vanskelige fejl - den type, der kun forekommer nu og da. Hvis denne begivenhed imidlertid er et crash, har du problemet - skyler du loggen til disken efter hvert opkald, så du kan se begivenheder helt op til nedbruddet, eller opbevar den i en buffer og skyl med jævne mellemrum bufferen og håber, at du ikke mister for meget, når nedbruddet opstår?

07

af 08

Brug af Cin til input: Formateret input

Der er to typer input.

  • Formateret. Læsning af input som tal eller af en bestemt type.
  • Uformateret. Læsning af byte eller strygere. Dette giver meget større kontrol over inputstrømmen.

Her er et simpelt eksempel på formateret input.

 // excin_1.cpp: Definerer indgangspunktet for konsolapplikationen. #include "stdafx.h" // Microsoft kun. #omfatte ved hjælp af navneområde std; int main (int argc, char * argv []) { int a = 0; float b = 0,0; int c = 0; cout << "Indtast venligst et int, en flyder og int adskilt med mellemrum" <> a >> b >> c; cout << "Du indtastede" << a << "" << b << "" << c << endl; retur 0; }

Dette bruger cin til at læse tre numre (int, flyde, int) adskilt af mellemrum. Du skal trykke på enter, når du har indtastet nummeret.

3 7.2 3 udsender "Du har indtastet 3 7.2 3".

Formateret input har begrænsninger!

Hvis du indtaster 3.76 5 8, får du "Du indtastede 3 0,76 5", alle andre værdier på den linje går tabt. Det opfører sig korrekt, som. er ikke en del af intet og markerer derfor starten af ​​float.

Fejlfinding

Cin-objektet indstiller en fail bit, hvis input ikke blev konverteret med succes. Denne bit er en del af ios og kan læses ved hjælp af svigte() funktion på begge cin og cout sådan her.

 hvis (cin.fail ()) // gør noget. 

Ikke overraskende, cout.fail () indstilles sjældent, i det mindste på skærmoutput. I en senere lektion om fil I / O, får vi se, hvordan cout.fail () kan blive sandt. Der er også en godt() funktion for cin, cout etc.

instagram story viewer