Hantera konsolen med iostream -klasserna i C ++

Managing Console With Iostream Classes C



I datorer är konsolen datorns tangentbord och datorskärmen. Tidigare skickades utdata direkt till bildskärmen och inte till ett fönster som visas på bildskärmen. För den vanliga datoranvändaren använder applikationer idag inte skärmen uttryckligen. Dessa program använder fönster som visas på monitorn. Datorprogrammeraren behöver dock fortfarande använda bildskärmen. Även om programmeraren fortfarande behöver använda bildskärmen, tillåter inte operativsystemet honom att göra det. Operativsystemet ger ett fönster som simulerar bildskärmen. I Windows operativsystem kallas detta fönster för kommandotolken. I Linux -operativsystemet och dess varianter kallas det här fönstret för terminalen.

Det förväntas att läsaren redan vet hur man använder kommandotolken eller terminalen. Den här artikeln förklarar hur du läser tecken och strängar från tangentbordet och skickar tecken och strängar till terminalen (eller kommandotolken). Varje C ++ programmerare behöver veta i den här artikeln.







För att få inmatning från tangentbordet och utmatning till terminalen måste programmet börja med:



#omfatta
använder sig av namnrymdtimmar;

Artikelinnehåll

Smala strömobjekt i standard iostream

Iostream -klassen, standardobjekten, cout, cin, cerr och clog, har instanserats och redan i standardbiblioteket. Programmeraren använder dem bara utan att instansera dem igen.



kosta

Följande påstående i huvudfunktionen () skickar texten, Detta matas ut. till terminalen:





kosta << 'Detta är utdata.';

cout är ett utmatnings iostream -objekt i standardbiblioteket, redan instanserat.<< is the insertion operator, which sent the bytes, This is output. to the output stream object, cout. When the statement is executed, the text appears on the screen.

Med ovanstående uttalande visas kommandotolken som åter visas till höger om utmatningsfrasen. Det går inte till nästa rad. endl i slutet av följande uttalande tvingar det som skrivs ut av skärmen till nästa rad:



kosta << 'Detta är utdata.' <<endl;

endl är en fördefinierad variabel. Skärminnehåll kan också tvingas till nästa rad med:

kosta << 'Detta är utdata.' << ' n';

Med hjälp av ‘ n’ kanske alla textrader fortfarande inte visas på skärmen omedelbart. endl spolar hela textraden till skärmen.

Obs: en sträng som skickas till cout finns i dubbla citattecken, medan ett tecken som skickas är i enskilda citattecken. En rad strängar och tecken kan skickas i ett uttalande, var och en föregås av<< . All that will appear in one line at the output if ‘ ’ is not in the series.

gin

cin är det vanliga iostream -inmatningsobjektet, redan instanserat och tillgängligt i standardbiblioteket. Tänk på följande kodsegment i huvudfunktionen ():

rödingText[femtio];
kosta << 'Ange ett ord och tryck på Enter:' Text;
kosta <<Text<<endl;

Den första satsen förklarar en tom uppsättning med 50 tecken. Det andra påståendet instruerar användaren att skriva in ett ord på nästa skärmrad och trycka på Enter -tangenten. Observera användningen av 'endl' som tvingar användaren att skriva text på nästa rad på skärmen. När användaren skriver text ekas den inmatade texten till skärmen medan den går in i cin -objektet. Efter att ha tryckt på Enter körs den tredje satsen i kodsegmentet. Denna tredje sats skickar den inmatade texten till variabeln, txt. Den inmatade texten får inte vara längre än 50 tecken i detta fall. Observera användningen av extraktionsoperatören, >>. Den sista satsen visar den inmatade texten på skärmen.

cin kan ta mer än ett ord från tangentbordet, åtskilda av mellanslag. Dessa ord måste extraheras till olika variabler. Följande kodsegment illustrerar detta:

rödingText[tjugo];
intden;
flytamed;
kosta << 'Ange 3 värden och tryck på Enter:' Text>>den>>med;
kosta <<Text<< '' <<den<< '' <<med<<endl;

Observera uttalandet:

gin >>Text>>den>>med;

Det första ordet extraheras till txt, det bredvid det och det sista till ft. Om ingången var,

ett25 3.6

då skulle utsignalen från kodsegmentet vara,

ett25 3.6

cerr

Följande program har ett fel:

#omfatta
använder sig av namnrymdtimmar;

inthuvud()
{
i minInt;

lämna tillbaka 0;
}

Det första påståendet i main () är inte korrekt. Om namnet på filen med koden är temp.cc och den resulterande körbara filen ska kallas temp skickar följande g ++ kommando kompilatorns felmeddelande till filen, error.txt:

g++ -o temp temp.DC 2>fel.Text

Om filen error.txt inte finns skulle den skapas. Notera del 2> error.txt av kommandot g ++.

Skärmen är standardutmatningsdestinationen, och det är också standardfeldestinationen. Om 2> error.txt utelämnas från kommandot g ++ skickas kompilatorns felmeddelande till standardfeldestinationen, som fortfarande är skärmen (monitor).

Strömobjektet som representerar standardutmatningsmålet är cout. Strömobjektet som representerar standardfeldestinationen är cerr. Ett programkörningsfel kan skickas till skärmen enligt följande:

cerr << 'Felmeddelandet!' << ' n';

täppa till

En applikation tar olika ingångar vid olika tidpunkter. Alla ingångar kan åter visas på skärmen. Alla ingångar kan sparas i en fil. Det här är loggning. Standard loggdestination är skärmen. Det vanliga loggningsströmobjektet är en täppa. Följande kod visar åter inmatningstexten på skärmen:

rödingText[femtio];
kosta<<'Skriv in text och tryck på Enter:'Text;
täppa till<<Text<<endl;

Om inmatningstexten är 'input_text', så täpper igen 'input_text' till skärmen.

I praktiken omdirigeras vanligtvis loggning till en fil. Följande program illustrerar detta:

#omfatta
använder sig av namnrymdtimmar;

inthuvud()
{
fritt( 'log.txt','i',stdout);

kosta << 'mata in text' <<endl;
}

Observera användningen av funktionen, freopen () och dess argument. Dess första argument är namnet på loggfilen. Om filen inte finns skulle den skapas. Dess andra argument är 'w' för 'skriva'. Dess tredje argument är stdout för standard-output. Det andra uttalandet i huvudfunktionen () använder cout för att skicka loggningstexten till filen. Obs: Den faktiska inmatningskoden har inte visats i detta program.

Få tecken och strängar från tangentbordet

Medan användaren skriver inmatning skickas tecknen till inmatningsströmbufferten och visas på skärmen. När användaren trycker på Enter -tangenten finns alla tecken i bufferten; markören går också till början av nästa rad nedan, på skärmen. Programmet fortsätter sedan till nästa programuttalande, efter inmatningsavläsningen.

Cin -objektet har metoder som det här avsnittet handlar om.

Läser den första karaktären

get (char_type & c):
Följande kodsegment visar hur man läser det första tecknet från inmatningsströmbufferten:

rödingkap;
kosta << 'Mata in text:' <<endl;
gin.skaffa sig(kap);
kosta <<kap<<endl;

Det första uttalandet förklarar ett tecken utan tilldelning. Det andra uttalandet uppmanar användaren att mata in ett tecken. När användaren skriver in tecken och trycker på Enter -tangenten, kopierar den tredje satsen tecknet från inmatningsströmbufferten till variabeln, kap.

Även om användaren skrev in mer än ett tecken skulle det första tecknet tas av kodsegmentet.

skaffa sig():
get () utan argument, returnerar den decimala ASCII -koden. Tänk på följande kodsegment:

kosta << 'Mata in text:' <<endl;
kosta << gin.skaffa sig() <<endl;

Om ingången är 'asdfg', skulle 97 returneras, vilket är den decimala ASCII -koden för 'a'.

get (char_type* s, streamsize n)

När användaren har matat in en fras och tryckt på Enter -tangenten kan ett antal tecken som börjar från den första extraheras från cin stream bufferten. Följande kod kan användas:

rödingsid[10];
kosta << 'Mata in text:' <<endl;
gin.skaffa sig(str,10);
kosta <<sid<<endl;

Om ingången är 'stora människor', kommer utmatningen att vara 'bra peo', med 9 tecken och inte 10. Strängen NUL -tecken ( 0) intar den tionde positionen i get -argumentet. Så för att ha 9 tecken i str måste lagringsstorleken vara minst 10 och get () -argumentet måste vara 11. Om hela inmatningsraden önskas måste stränglagringsnumret vara minst talet av tecknade tecken, plus 1. Så, om 12 tecken skrivs in för hela raden, bör siffran vara 13 för strängens (str) lagringsstorlek och 13 för get () -argumentet. Observera att ett mellanslag räknas som ett tecken.

get (char_type* s, streamsize n, char_type delim)
Det är möjligt att extrahera en understräng, avgränsad till höger, genom att ett visst tecken förekommer första gången eller genom understrängens strömstorlek, som någonsin kommer först. Om inmatningstexten till följande kod är fantastiska människor, skulle bra extraheras:

rödingsid[30];
kosta << 'Mata in text:' <<endl;
gin.skaffa sig(str,6,'eller');
kosta <<sid<<endl;

Den sjätte positionen från början är rymdkaraktären, och den avgränsar den extraherade delsträngen exklusivt. Den sjätte positionen kommer först före den enda karaktären, 'o'. Observera att lagringsstorleken för str kan vara så hög som möjligt.

Om inmatningstexten till följande kod är fantastiska människor, skulle gr extraheras:

rödingsid[30];
kosta << 'Mata in text:' <<endl;
gin.skaffa sig(str,10,'Och');
kosta <<sid<<endl;

Den första förekomsten av 'e' kommer först före den tionde positionen.

Få alla tecken på en rad

Efter att ha tryckt på Enter -tangenten kan alla tecken som skrivs in i raden hämtas som visas i följande kod:

kosta << 'Mata in text:' <<endl;
medan (1) {
rödingkap= (röding)gin.skaffa sig();
kosta <<kap;
om (kap== ' n')
ha sönder;
}

Castningen med (char) konverterar varje decimaltal till motsvarande ASCII -tecken.

titt()

Get () medlemsfunktioner läser inte bara nästa tecken; de tar bort det från strömbufferten. Peek () -medlemfunktionen läser dock nästa tecken (med början från det första) utan att ta bort det från bufferten. I följande kod läses varje tecken först med funktionen peek () innan det tas bort, med funktionen get (). Allt som händer efter att användaren trycker på Enter -tangenten:

kosta << 'Mata in text:' <<endl;
medan (1) {
rödingkap= (röding)gin.titt();
kosta <<kap;
gin.skaffa sig();
om (kap== ' n')
ha sönder;
}

Om nästa tecken inte togs bort med get (), skulle peek () bara läsa det första tecknet, och slingan kommer att upprepas på obestämd tid.

Visa och ta bort tecken innan du trycker på Enter

Lägg märke till att med cin -objektet måste du trycka på Enter -tangenten för att det ska bli någon åtgärd. Tja, det är möjligt att tecken visas medan de skrivs och raderas innan du trycker på Enter -tangenten. Det betyder emellertid gränssnitt med operativsystemet. Operativsystem skiljer sig åt. Så detta betyder olika kodning för olika operativsystem. Så det här ämnet förtjänar en helt annan handledning - se senare.

Skicka tecken och strängar till bildskärmen

Cout -objektet är ett utmatningsströmobjekt, redan instanserat och finns i standardbiblioteket C ++. cout är huvudobjektet som används för att skicka tecken och strängar till bildskärmen. Detta görs med insättningsoperatören,<< . With the cin object, the text is obtained line-by-line. With the cout object, the text is added onto the same line until ‘ ’ or endl is encountered.

Uttryck som resulterar i skalarer kan vara argument för infogningsoperatorn. Operatören konverterar skalaren till text och placerar texten i cout -objektströmmen. När text skickas till cout -objektet visas det normalt på skärmen (bildskärm). Emellanåt kanske det inte visas omedelbart. För att tvinga fram text på skärmen sätter du in specialvärdet, endl, precis efter att du har infogat texten. Detta gör att texten spolas till skärmen och en ny rad läggs till. Obs! ‘ N’ lägger helt enkelt till en ny rad men spolar inte text till skärmen.

Följande program visar hur du skriver ut värdena för int, float och vanlig text på skärmen:

#omfatta
använder sig av namnrymdtimmar;

inthuvud()
{
intden= 5;
flytamed= 63,5;
kosta << 'The' <<den<< 'objekt kostar $' <<med<< 'USA.' <<endl;

lämna tillbaka 0;
}

Utgången är:

De5artiklar kostar $63,5USA.

Följande program visar hur strängen för ett objekt som instanserats från en klass skrivs ut:

#omfatta
använder sig av namnrymdtimmar;

strukturSt.{
rödingsid[elva] = 'några ord';
}obj;

inthuvud()
{
kosta <<obj.sid << ' n';

lämna tillbaka 0;
}

Utdata är 'några ord'.

Argument för ett C ++ - program

Programkörning börjar från huvudfunktionen (). Huvudfunktionen () har faktiskt två valfria parametrar. Syntaxen för huvudfunktionen () med de valfria parametrarna är:

inthuvud(intargc,röding *argv[argc])
{

lämna tillbaka 0;
}

Antag att namnet på den körbara C ++ - filen är temp. Antag att de argument som programmet behöver från sin omgivning (operativsystem), skrivna av användaren, är,

artiklar3bokpenna'stort hus'

Det finns 5 argument här: artiklar, 3, bok, penna och stort hus

Var och en är text. Ett numrerat argument till ett program är text. Med andra ord är varje argument en sträng. stort hus står i citattecken eftersom det är en fras. Terminalkommandot för att köra detta program skulle vara:

./tempartiklar3bokpenna'stort hus'

Förutsatt att filtemp finns i hemkatalogen. Observera att mellanslag och inte kommatecken skiljer argumenten åt.

Nu, i huvudfunktionssyntaxen, är argc antalet argument för programmet, plus 1. I det här fallet finns det 5 argument för programmet. Så, argc är 6. I syntaxen är argv [argc] en rad pekare till strängar. Det första värdet för denna array vid argv [0] ges av kompilatorn. Det är en pekare till namnet på programfilen. Resten av värdena är pekare till programargumenten i användarens ordning som skrivits in. Storleken på denna array är argc. I detta fall är storleken 1 + 5 = 6.

Antag att följande program vid sammanställningen heter temp:

#omfatta
använder sig av namnrymdtimmar;

inthuvud(intargc,röding**argv)
{

kosta <<argv[0] << ',' <<argv[1] << ',' <<argv[2] << ',' <<argv[3] << ',' <<argv[4] << ',' <<argv[5] <<endl;

lämna tillbaka 0;
}

Observera här att matrisen 'char*argv [argc]' har deklarerats som 'char ** argv'.

Om detta program körs med terminalkommandot,

./tempartiklar3bokpenna'stort hus'

då skulle utgången vara:

./temp, artiklar,3, bok, penna, stort hus

Observera att katalogsökvägen har inkluderats med namnet på den körbara filen.

Observera också att värdet för argc inte har skickats under programmets körning (anrop av programmet).

Slutsats

Iostream -klassen har fyra viktiga objekt som är cout, cin, cerr och clog. cin är ett inmatningsobjekt, medan resten är utmatningsobjekt. När ett program körs, är ingången till programmet annorlunda än när programmet ska börja köras. När ett program börjar köras förenas ingången till programmet med kommandot för att köra programmet, åtskilt av mellanslag.