01
av 08
Ett nytt sätt att producera
C ++ behåller mycket hög bakåtkompatibilitet med C, så
I den föregående lektionen berördes detta med ett exempel som använde cout. Här kommer vi att gå in i lite mer djup och börja med output först eftersom det tenderar att användas mer än input.
Iiostream-klassen ger tillgång till de objekt och metoder du behöver för både utgång och inmatning. Tänk på i / o när det gäller strömmar av byte - antingen går från din applikation till en fil, skärmen eller en skrivare - som matas ut eller från tangentbordet - som matas in.
Utgång med Cout
Om du känner till C, kanske du vet det << används för att flytta bitar till vänster. Exempelvis 3 << 3 är 24. Exempelvis vänsterskift fördubblar värdet så att 3 vänsterskift multiplicerar det med 8.
I C ++ << har varit överbelastad i ostreamklassen så att int, flytaoch strängtyper (och deras varianter - t.ex. dubbel) stöds alla. Så här gör du textutmatning genom att stränga ihop flera objekt mellan <<.>
cout << "Lite text" << intval << floatdouble << endl;
Denna speciella syntax är möjlig eftersom var och en av << är faktiskt ett funktionssamtal som returnerar a referens till en oström objekt. Så en linje som ovan är faktiskt så här
cout. << ("lite text"). cout. << (intvalue) .cout. << (floatdouble) .cout. << (endl);
C fungeraprintf kunde formatera utdata med formatspecifikationer som% d. I C ++ kan cout också formatera utdata men använder ett annat sätt att göra det.
02
av 08
Använda Cout för att formatera utgången
Objektet cout är medlem av iostream bibliotek. Kom ihåg att detta måste ingå i en
#inkludera
Detta bibliotek iostream härleds från ostream (för utgång) och iStream för input.
formatering av textutmatningen görs genom att sätta in manipulatorer i utgångsströmmen.
Vad är en manipulator?
Det är en funktion som kan ändra egenskaperna för utgångsströmmen (och ingången). På föregående sida såg vi det << var en överbelastad funktion som returnerade en referens till det anropande objektet, t.ex. cout för utgång eller cin för input. Alla manipulatorer gör detta så att du kan inkludera dem i utgången << eller ingång >>. Vi ska titta på input och >> senare i den här lektionen.
räkna << endl;
endl är en manipulator som slutar linjen (och startar en ny). Det är en funktion som också kan kallas på detta sätt.
endl (cout);
Men i praktiken skulle du inte göra det. Du använder det så här.
cout << "Lite text" << endl << endl; // Två tomma rader.
Filer är bara strömmar
Något att tänka på att med mycket utveckling idag görs i GUI applikationer, varför skulle du behöva text I / O-funktioner? Är det inte bara för trösta program? Tja, du kommer antagligen att göra fil I / O och du kan använda dem där också, men också vad som matas ut till skärmen behöver vanligtvis också formatering. Strömmar är ett mycket flexibelt sätt att hantera input och output och kan arbeta med
- Text I / O. Som i konsolapplikationer.
- Strängar. Praktiskt för formatering.
- Fil I / O.
Manipulatorer igen
Även om vi har använt ostream klass, det är en härledd klass från ios klass som härrör från ios_base. Denna förfäder klass definierar allmänheten funktioner som är manipulatorer.
03
av 08
Lista över Cout Manipulatorer
Manipulatorer kan definieras i in- eller utgångsströmmar. Dessa är objekt som returnerar en referens till objektet och placeras mellan par av <<. De flesta av manipulatorerna deklareras i, men endl, ändarna och spola komma från
Här är en mer detaljerad lista.
Från
- endl - Avslutar linjen och samtal spolar.
- slutar - Infogar '\ 0' ( NULL) in i strömmen.
- spola - Tvinga bufferten att matas ut omedelbart.
Från . De flesta deklareras i
- boolalpha - Infoga eller extrahera boolobjekt som "sant" eller "falskt".
- noboolalpha - Infoga eller extrahera boolobjekt som numeriska värden.
- fast - Sätt in flytpunktsvärden i fast format.
- vetenskapligt - Sätt in flytande punktvärden i vetenskapligt format.
- internt - Internt-motivera.
- vänster - Vänster-motivera.
- rätt - rättfärdiggöra.
- dec - Infoga eller extrahera heltal i decimalformat.
- hex - Infoga eller extrahera heltal i hexadecimalt (bas 16) -format.
- okt - Infoga eller extrahera värden i oktalt (bas 8) format.
- noshowbase - Prefixar inte värdet med dess bas.
- showbase - Prefixvärde med dess bas.
- noshowpoint - Visa inte decimalpunkt om det inte är nödvändigt.
- showpoint - Visa alltid decimalpunkt när du sätter in flytande punktvärden.
- noshowpos - Lägg inte in plustecken (+) om siffran> = 0.
- showpos - Lägg in plustecken (+) om siffran> = 0.
- noskipws - Hoppa inte över det första vita utrymmet när du extraherar.
- skipws - Hoppa över det första vita utrymmet vid extraktion
- nouppercase - Ersätt inte små bokstäver med stora bokstäver.
- versaler - Byt ut små bokstäver med stora bokstäver.
- unitbuf - Spola buffert efter en insats.
- nounitbuf - Spola inte buffert efter varje insats.
04
av 08
Exempel med användning av Cout
// ex2_2cpp. # inkludera "stdafx.h" #inkluderamed namnutrymme std; int main (int argc, char * argv []) { cout.width (10); cout << höger << "Test" << endl; cout << kvar << "Test 2" << endl; cout << intern << "Test 3" << endl; cout << endl; cout.precision (2); cout << 45.678 << endl; cout << stora bokstäver << "David" << endl; cout.precision (8); cout << vetenskaplig << endl; cout << 450678762345.123 << endl; cout << fast << 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:: versaler); cout << hex << endl; cout << 1234 << endl; cout << okt << endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; retur 0; }
Utmatningen från detta är nedan, med ett eller två extra linjeavstånd för tydlighet.
Testa. Test 2. Test 3. 46. David. 4.50678762E + 011. 450678762345.12299000. 0X4D2. 02322. +1234. 4D2. 2322. 1234.
Notera: Trots stora versaler skrivs David ut som David och inte DAVID. Detta beror på att versaler endast påverkar genererad produktion - t.ex. nummer tryckt i hexadecimalt. Så hexutgången 4d2 är 4D2 när versaler är i drift.
Dessutom sätter de flesta av dessa manipulatorer faktiskt lite i en flagga och det är möjligt att ställa in detta direkt med
cout.setf ()
och rensa det med
cout.unsetf ()
05
av 08
Använda Setf och Unsetf för att manipulera I / O-formatering
Funktionen setf har två överbelastad versioner som visas nedan. Medan unsetf rensar bara de angivna bitarna.
setf (flaggvärden); setf (flagvalues, maskvalues); unsetf (flagvalues);
Variabla flaggor härleds av O-ringen tillsammans alla bitar du vill ha med |. Så om du vill vetenskapliga, stora och boolalpha använd sedan detta. Endast bitarna passerade som parameter är inställda. De andra bitarna lämnas oförändrade.
cout.setf (ios_base:: vetenskaplig | ios_base:: huvudversion | ios_base:: boolalpha); cout << hex << endl; cout << 1234 << endl; cout << dec << endl; cout << 123400003744.98765 << endl; boolvärde = sant; cout << värde << endl; cout.unsetf (ios_base:: boolalpha); cout << värde << endl;
producerar
4D2. 1.234000E + 011. Sann. 1.
Maskeringsbitar
De två parameter version av setf använder en mask. Om biten är inställd i både den första och den andra parametern blir den inställd. Om biten bara finns i den andra parametern rensas den. Värdena justerfält, basfält och floatfield (listas nedan) är sammansatta flaggor, det vill säga flera flaggor Or'd tillsammans. För basefield med värdena 0x0e00 är det samma som dec | okt | hex. Så
setf (ios_base:: hex, ios_basefield);
rensar alla tre flaggorna sedan sätter hex. Liknande adjustfield är vänster | rätt | inre och floatfield är vetenskapliga | fast.
Lista över bitar
Denna lista med enums är hämtad från Microsoft Visual C ++ 6.0. De faktiska värden som används är godtyckliga - en annan kompilator kan använda olika värden.
skipws = 0x0001. enhetbuf = 0x0002. versaler = 0x0004. showbase = 0x0008. showpoint = 0x0010. showpos = 0x0020. vänster = 0x0040. höger = 0x0080. intern = 0x0100. minskning = 0x0200. okt = 0x0400. hex = 0x0800. vetenskapligt = 0x1000. fast = 0x2000. boolalpha = 0x4000. justeringsfält = 0x01c0. basfält = 0x0e00, floatfield = 0x3000. _Fmtmask = 0x7fff, _Fmtzero = 0.
06
av 08
Om Clog och Cerr
Tycka om cout, täppa till och cerr är fördefinierade objekt definierade i ostream. Iiostream-klassen ärver från båda ostream och iStream så det är därför cout exempel kan användas iostream.
Buffrat och obuffat
- Buffered - All output lagras tillfälligt i a buffert och dumpade sedan till skärmen på en gång. Både cout och täppa buffras.
- Unbuffered - All output går omedelbart till output-enheten. Ett exempel på ett obuffrat objekt är cerr.
Exemplet nedan visar att cerr används på samma sätt som cout.
#inkludera med namnutrymme std; int _tmain (int argc, _TCHAR * argv []) {cerr.width (15); cerr.right; cerr << "Fel" << endl; retur 0; }
Det största problemet med buffring är om program kraschar då buffertinnehållet går förlorat och det är svårare att se varför det kraschade. Utbuffrad utgång är omedelbar så att det kan vara användbart att stänga några rader som denna genom koden.
cerr << "Entering Dangerous function zappit" << endl;
Loggproblemet
Att bygga en logg över programhändelser kan vara ett användbart sätt att upptäcka svåra buggar - den typ som bara förekommer då och då. Om den händelsen dock är en krasch har du problemet - spolar du loggen till disken efter varje samtal så att du kan se händelser ända fram till kraschen eller förvara den i en buffert och spola med jämna mellanrum bufferten och hoppas att du inte tappar för mycket när kraschen inträffar?
07
av 08
Använda Cin för inmatning: formaterad inmatning
Det finns två typer av input.
- Formateras. Läser inmatning som siffror eller av en viss typ.
- Oformaterad. Läser byte eller strängar. Detta ger mycket större kontroll över ingångsströmmen.
Här är ett enkelt exempel på formaterad inmatning.
// excin_1.cpp: Definierar ingångspunkten för konsolapplikationen. #include "stdafx.h" // Microsoft endast. #inkludera med namnutrymme std; int main (int argc, char * argv []) { int a = 0; flottör b = 0,0; int c = 0; cout << "Vänligen ange en int, en flottör och int åtskild med mellanslag" <> a >> b >> c; cout << "Du angav" << a << "" << b << "" << c << endl; retur 0; }
Detta använder cin för att läsa tre siffror (int, flyta, int) separerade med mellanslag. Du måste trycka på enter efter att du har skrivit in numret.
3 7.2 3 kommer att mata ut "Du angav 3 7.2 3".
Formaterad ingång har begränsningar!
Om du anger 3,76 5 8 får du "Du angav 3 0,76 5", alla andra värden på den raden går förlorade. Det uppför sig korrekt, som. är inte en del av int och markerar därför flottörens början.
Felfångst
Cin-objektet ställer in en misslyckad bit om ingången inte konverterades framgångsrikt. Den här biten är en del av ios och kan läsas med hjälp av misslyckas() funktion på båda cin och cout så här.
om (cin.fail ()) // gör något.
Inte överraskande, cout.fail () är sällan inställd, åtminstone på skärmutdata. I en senare lektion om fil I / O ser vi hur cout.fail () kan bli sant. Det finns även en Bra() funktion för cin, cout etc.