Správa konzoly pomocí tříd iostream v C ++

Managing Console With Iostream Classes C



Při práci na počítači je konzole klávesnice počítače a monitor počítače. V minulosti byl výstup odesílán přímo na obrazovku monitoru, nikoli do okna zobrazeného na monitoru. Pro běžného uživatele počítače dnes aplikace monitor výslovně nepoužívají. Tyto aplikace používají okna zobrazená na monitoru. Počítačový programátor však stále potřebuje používat obrazovku monitoru. Přestože programátor stále potřebuje používat obrazovku monitoru, operační systém mu to neumožňuje. Operační systém poskytuje okno, které simuluje obrazovku monitoru. V operačním systému Windows se toto okno nazývá Příkazový řádek. V operačním systému Linux a jeho variantách se toto okno nazývá terminál.

Očekává se, že čtenář již ví, jak používat příkazový řádek nebo terminál. Tento článek vysvětluje, jak číst znaky a řetězce z klávesnice a odesílat znaky a řetězce do terminálu (nebo příkazového řádku). Každý programátor C ++ potřebuje vědět v tomto článku.







Aby měl program vstup z klávesnice a výstup do terminálu, musí program začínat:



#zahrnout
použitím jmenný prostorhodiny;

Obsah článku

Objekty úzkého proudu standardního iostreamu

Třída iostream, standardní objekty, cout, cin, cerr a clog, byly vytvořeny a již jsou ve standardní knihovně. Programátor je pouze použije, aniž by je znovu vytvořil.



náklady

Následující příkaz ve funkci main () odešle text This is output. na terminál:





náklady << 'Toto je výstup.';

cout je výstupní iostream objekt ve standardní knihovně, již vytvořený.<< 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.

S výše uvedeným příkazem se znovu zobrazený příkazový řádek zobrazí napravo od výstupní fráze. Nejde na další řádek. endl na konci následujícího příkazu vynutí to, co je na obrazovce vytištěno na další řádek:



náklady << 'Toto je výstup.' <<endl;

endl je předdefinovaná proměnná. Obsah obrazovky lze také vynutit na další řádek pomocí:

náklady << 'Toto je výstup.' << ' n';

Při použití „ n“ se všechny řádky textu nemusí na obrazovce okamžitě zobrazit. endl vyprázdní celý řádek textu na obrazovku.

Poznámka: řetězec odeslaný do cout je v uvozovkách, zatímco odeslaný znak je v jednoduchých uvozovkách. Sérii řetězců a znaků lze odeslat v jednom příkazu, před kterým každý předchází<< . All that will appear in one line at the output if ‘ ’ is not in the series.

gin

cin je standardní vstupní objekt iostream, již vytvořený instancí a dostupný ve standardní knihovně. Zvažte následující segment kódu ve funkci main ():

chartxt[padesátka];
náklady << 'Zadejte slovo a stiskněte Enter:' txt;
náklady <<txt<<endl;

První příkaz deklaruje prázdné pole 50 znaků. Druhý příkaz instruuje uživatele, aby na dalším řádku obrazovky zadal slovo a stiskl klávesu Enter. Všimněte si použití 'endl', které nutí uživatele zadávat text na další řádek obrazovky. Když uživatel zadává text, zadaný text se odráží na obrazovku, zatímco přechází do objektu cin. Po stisknutí klávesy Enter se provede třetí příkaz v segmentu kódu. Tento třetí příkaz odešle zadaný text do proměnné txt. Zadaný text by v tomto případě neměl být delší než 50 znaků. Všimněte si použití extrakčního operátoru, >>. Poslední příkaz zobrazí zadaný text na obrazovce.

cin může z klávesnice převzít více než jedno slovo oddělené mezerami. Tato slova bude nutné extrahovat do různých proměnných. Následující segment kódu to ilustruje:

chartxt[dvacet];
intto;
plovákft;
náklady << 'Zadejte 3 hodnoty a stiskněte Enter:' txt>>to>>ft;
náklady <<txt<< '' <<to<< '' <<ft<<endl;

Všimněte si prohlášení:

gin >>txt>>to>>ft;

První slovo se extrahuje do txt, další do něj a poslední do ft. Pokud byl vstup,

jeden25 3.6

pak by výstup podle segmentu kódu byl,

jeden25 3.6

cerr

Následující program obsahuje chybu:

#zahrnout
použitím jmenný prostorhodiny;

inthlavní()
{
v myInt;

vrátit se 0;
}

První tvrzení v main () není správné. Pokud je název souboru s kódem temp.cc a výsledný spustitelný soubor má být nazýván temp, pak následující příkaz g ++ odešle do souboru chybovou zprávu kompilátoru, error.txt:

G++ -o temp temp.DC 2>chyba.txt

Pokud soubor error.txt neexistuje, byl by vytvořen. Všimněte si části 2> error.txt příkazu g ++.

Obrazovka je standardním výstupním cílem a je také standardním cílem chyby. Pokud je v příkazu g ++ vynecháno 2> error.txt, pak by byla chybová zpráva kompilátoru odeslána na standardní chybové místo, kterým je stále obrazovka (monitor).

Objekt streamu, který představuje standardní výstupní cíl, je cout. Objekt streamu, který představuje standardní cíl chyby, je cerr. Chybu runtime programu lze odeslat na obrazovku následujícím způsobem:

cerr << 'Chybová zpráva!' << ' n';

dřevák

Aplikace má různé vstupy v různých časech. Všechny vstupy lze znovu zobrazit na obrazovce. Všechny vstupy lze uložit do souboru. Toto je protokolování. Standardním cílem protokolování je obrazovka. Standardní objekt datového proudu protokolování je ucpaný. Následující kód znovu zobrazí vstupní text na obrazovku:

chartxt[padesátka];
náklady<<'Zadejte text a stiskněte Enter:'txt;
dřevák<<txt<<endl;

Pokud je vstupní text 'input_text', pak clog znovu zobrazí 'input_text' na obrazovku.

V praxi je protokolování obvykle přesměrováno do souboru. Následující program to ilustruje:

#zahrnout
použitím jmenný prostorhodiny;

inthlavní()
{
otevřít( 'log.txt','v',standardní výstup);

náklady << 'vstupní text' <<endl;
}

Všimněte si použití funkce, freopen () a jejích argumentů. Jeho prvním argumentem je název souboru protokolu. Pokud soubor neexistuje, bude vytvořen. Jeho druhým argumentem je „w“ pro „zápis“. Jeho třetím argumentem je standardní výstup pro standardní výstup. Druhý příkaz ve funkci main () používá cout k odeslání protokolovaného textu do souboru. Poznámka: Skutečný vstupní kód nebyl v tomto programu zobrazen.

Získávání znaků a řetězců z klávesnice

Zatímco uživatel zadává vstup, znaky jsou odeslány do vyrovnávací paměti vstupního proudu a zobrazeny na obrazovce. Když uživatel stiskne klávesu Enter, všechny znaky jsou ve vyrovnávací paměti; kurzor také přejde na začátek dalšího řádku níže na obrazovce. Program poté pokračuje na další programový příkaz za vstupním příkazem ke čtení.

Objekt cin má metody, jimiž se tato část zabývá.

Čtení první postavy

získat (char_type & c):
Následující segment kódu ukazuje, jak číst první znak z vyrovnávací paměti vstupního proudu:

charch;
náklady << 'Vstupní text:' <<endl;
gin.dostat(ch);
náklady <<ch<<endl;

První příkaz deklaruje znak bez přiřazení. Druhý příkaz říká uživateli, aby zadal znak. Když uživatel zadá znak a stiskne klávesu Enter, třetí příkaz zkopíruje znak z vyrovnávací paměti vstupního proudu do proměnné, ch.

I kdyby uživatel zadal více než jeden znak, první znak by převzal segment kódu.

dostat():
get () bez argumentu, vrací desítkový kód ASCII. Zvažte následující segment kódu:

náklady << 'Vstupní text:' <<endl;
náklady << gin.dostat() <<endl;

Pokud je vstup „asdfg“, vrátí se 97, což je desítkový kód ASCII pro „a“.

get (char_type* s, streamsize n)

Poté, co uživatel zadá frázi a stiskne klávesu Enter, lze z vyrovnávací paměti cin proudu extrahovat několik znaků začínajících od prvního. Lze použít následující kód:

charp[10];
náklady << 'Vstupní text:' <<endl;
gin.dostat(str,10);
náklady <<p<<endl;

Pokud je vstupem „skvělí lidé“, pak výstupem bude „velký peo“, 9 znaků a ne 10. Řetězcový znak NUL ( 0) zaujímá v argumentu get desátou pozici. Aby tedy mělo 9 znaků v str, jeho velikost úložiště musí být alespoň 10 a argument get () musí být 11. Pokud je požadován celý vstupní řádek, pak číslo úložiště řetězců musí být alespoň číslo zadaných znaků plus 1. Pokud je tedy pro celý řádek napsáno 12 znaků, pak by číslo mělo být 13 pro velikost úložiště řetězce (str) a 13 pro argument get (). Jedna mezera se počítá jako jeden znak.

get (char_type* s, streamsize n, char_type delim)
Je možné extrahovat dílčí řetězec, oddělený vpravo, prvním výskytem konkrétního znaku nebo velikostí proudu dílčího řetězce, která je vždy na prvním místě. Pokud jsou vstupní text do následujícího kódu skvělí lidé, pak by byl skvělý extrahován:

charp[30];
náklady << 'Vstupní text:' <<endl;
gin.dostat(str,6,'nebo');
náklady <<p<<endl;

Šestou pozicí od začátku je znak mezery a ten výhradně ohraničuje extrahovaný podřetězec. Šestá pozice je na prvním místě před jedinou postavou „o“. Všimněte si toho, že velikost úložiště pro str může být co nejvyšší.

Pokud jsou vstupní text do následujícího kódu skvělí lidé, extrahují se gr:

charp[30];
náklady << 'Vstupní text:' <<endl;
gin.dostat(str,10,'A');
náklady <<p<<endl;

První výskyt 'e' je na prvním místě před desátou pozicí.

Získání všech postav linky

Po stisknutí klávesy Enter lze získat všechny znaky zadané do řádku, jak ukazuje následující kód:

náklady << 'Vstupní text:' <<endl;
zatímco (1) {
charch= (char)gin.dostat();
náklady <<ch;
-li (ch== ' n')
přestávka;
}

Přetypování pomocí (char) převede každé desetinné číslo na odpovídající znak ASCII.

nahlédnout ()

Členské funkce get () nečtou pouze další znak; odeberou to z vyrovnávací paměti proudu. Jednoduchá členská funkce peek () však přečte další znak (od prvního), aniž by jej odstranila z vyrovnávací paměti. V následujícím kódu je každý znak nejprve přečten pomocí funkce peek () a poté odebrán funkcí get (). Vše, co se stane poté, co uživatel stiskne klávesu Enter:

náklady << 'Vstupní text:' <<endl;
zatímco (1) {
charch= (char)gin.nahlédnout();
náklady <<ch;
gin.dostat();
-li (ch== ' n')
přestávka;
}

Pokud by další znaky nebyly odstraněny příkazem get (), peek () by četl pouze první znak a smyčka by se opakovala neomezeně dlouho.

Zobrazení a mazání znaků před stisknutím klávesy Enter

Všimněte si, že u objektu cin musí být před provedením akce stisknuto tlačítko Enter. Je možné, že se znaky zobrazují při psaní a mazání před stisknutím klávesy Enter. To však znamená propojení s operačním systémem. Operační systémy se liší. To tedy znamená různé kódování pro různé operační systémy. Toto téma si tedy zaslouží úplně jiný návod - viz později.

Odesílání znaků a řetězců na monitor

Objekt cout je objekt výstupního proudu, již vytvořený instancí a přítomný ve standardní knihovně C ++. cout je hlavní objekt používaný při odesílání znaků a řetězců na monitor. To se provádí pomocí operátoru vkládání,<< . 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.

Výrazy, jejichž výsledkem jsou skaláry, mohou být argumenty pro operátor vložení. Operátor převede skalár na text a umístí text do proudu objektu cout. Když je text odeslán do objektu cout, normálně se objeví na obrazovce (monitoru). Občas se však nemusí objevit hned. Chcete -li vynutit text na obrazovku, vložte speciální hodnotu, endl, hned po vložení textu. To způsobí, že text bude vypuštěn na obrazovku a bude přidán nový řádek. Poznámka: „ n“ jednoduše přidá nový řádek, ale nespustí text na obrazovku.

Následující program ukazuje, jak vytisknout hodnoty int, float a obyčejného textu na obrazovku:

#zahrnout
použitím jmenný prostorhodiny;

inthlavní()
{
intto= 5;
plovákft= 63,5;
náklady << 'The' <<to<< „položky stojí $“ <<ft<< 'USA.' <<endl;

vrátit se 0;
}

Výstupem je:

The5položky stojí $63,5NÁS.

Následující program ukazuje, jak se vytiskne řetězec objektu vytvořeného ve třídě:

#zahrnout
použitím jmenný prostorhodiny;

strukturaSvatý{
charp[jedenáct] = 'nějaká slova';
}obj;

inthlavní()
{
náklady <<obj.p << ' n';

vrátit se 0;
}

Výstupem je 'některá slova'.

Argumenty pro program C ++

Spuštění programu začíná funkcí main (). Funkce main () má ve skutečnosti dva volitelné parametry. Syntaxe funkce main () s volitelnými parametry je:

inthlavní(intargc,char *argv[argc])
{

vrátit se 0;
}

Předpokládejme, že název spustitelného souboru C ++ je dočasný. Předpokládejme, že argumenty, které program potřebuje ze svého prostředí (operačního systému), zadaného uživatelem, jsou,

články3knižní pero'velký dům'

Zde je 5 argumentů: články, 3, kniha, pero a velký dům

Každý je text. Očíslovaný argument pro program je text. Jinými slovy, každý argument je řetězec. velký dům je v uvozovkách, protože je to fráze. Příkaz terminálu ke spuštění tohoto programu by byl:

./dočasné články3knižní pero'velký dům'

Za předpokladu, že teplota souboru je v domovském adresáři. Argumenty oddělují mezery a ne čárky.

Nyní je v syntaxi funkce main () argc počet argumentů pro program plus 1. V tomto případě je pro program 5 argumentů. Takže argc je 6. V syntaxi je argv [argc] pole ukazatelů na řetězce. První hodnota pro toto pole v argv [0] je dána kompilátorem. Je to ukazatel na název souboru programu. Zbývající hodnoty jsou ukazateli na programové argumenty v zadaném pořadí uživatele. Velikost tohoto pole je argc. V tomto případě je velikost 1 + 5 = 6.

Předpokládejme, že při kompilaci má následující program název temp:

#zahrnout
použitím jmenný prostorhodiny;

inthlavní(intargc,char**argv)
{

náklady <<argv[0] << ',' <<argv[1] << ',' <<argv[2] << ',' <<argv[3] << ',' <<argv[4] << ',' <<argv[5] <<endl;

vrátit se 0;
}

Zde si povšimněte, že pole 'char*argv [argc]' bylo deklarováno jako 'char ** argv'.

Pokud je tento program spuštěn pomocí příkazu terminálu,

./dočasné články3knižní pero'velký dům'

pak by výstup byl:

./teplota, články,3kniha, pero, velký dům

Poznámka: cesta k adresáři byla zahrnuta do názvu spustitelného souboru.

Všimněte si také, že při běhu programu (volání programu) nebyla odeslána hodnota pro argc.

Závěr

Třída iostream má čtyři důležité objekty, které jsou cout, cin, cerr a clog. cin je vstupní objekt, zatímco zbytek jsou výstupní objekty. Během běhu programu je vstup do programu odlišný od toho, kdy se má program spustit. Když se program spustí, vstup do programu se spojí s příkazem ke spuštění programu, oddělený mezerami.