A konzol kezelése az iostream osztályokkal C ++ nyelven

Managing Console With Iostream Classes C



Számítástechnikában a konzol a számítógép billentyűzete és a számítógép monitorja. Régebben a kimenetet közvetlenül a monitor képernyőjére küldték, nem pedig a monitoron megjelenő ablakba. A hétköznapi számítógép -felhasználók számára ma az alkalmazások nem használják kifejezetten a monitort. Ezek az alkalmazások a monitoron megjelenő ablakokat használják. A számítógépes programozónak azonban továbbra is használnia kell a monitor képernyőjét. Bár a programozónak továbbra is használnia kell a monitor képernyőjét, az operációs rendszer ezt nem teszi lehetővé. Az operációs rendszer egy ablakot biztosít, amely szimulálja a monitor képernyőjét. A Windows operációs rendszerben ezt az ablakot Parancssornak hívják. A Linux operációs rendszerben és változataiban ezt az ablakot terminálnak nevezik.

Várhatóan az olvasó már tudja, hogyan kell használni a parancssort vagy a terminált. Ez a cikk elmagyarázza, hogyan olvashat karaktereket és karakterláncokat a billentyűzetről, és hogyan küldhet karaktereket és karakterláncokat a terminálra (vagy parancssorba). Ebben a cikkben minden C ++ programozónak tudnia kell.







Annak érdekében, hogy a billentyűzetről bemenetet kapjon, és kimenetet küldjön a terminálra, a programnak a következővel kell kezdődnie:



#befoglalni
segítségével névtérórák;

Cikk tartalma

A standard iostream keskeny folyam objektumai

Az iostream osztály, a standard objektumok, a cout, a cin, a cerr és az eltömődés példányosítva jelentek meg, és már megtalálhatók a standard könyvtárban. A programozó csak használja őket anélkül, hogy újra példányosítaná őket.



költség

A main () függvény alábbi állítása küldi a szöveget: Ez a kimenet. a terminálhoz:





költség << 'Ez a kimenet.';

cout egy kimeneti iostream objektum a standard könyvtárban, már példányosítva.<< 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.

A fenti utasítással az újra megjelenő parancssor jelenik meg a kimeneti kifejezés jobb oldalán. Nem megy a következő sorba. Az endl a következő utasítás végén a képernyőn nyomtatottakat a következő sorra kényszeríti:



költség << 'Ez a kimenet.' <<endl;

Az endl egy előre definiált változó. A képernyőtartalom a következő sorra is rákényszeríthető:

költség << 'Ez a kimenet.' << ' n';

A „ n” használatával előfordulhat, hogy az összes szövegsor nem jelenik meg azonnal a képernyőn. Az endl a teljes szövegsort a képernyőre fújja.

Megjegyzés: a couthoz küldött karakterlánc dupla idézőjelekben, míg a küldött karakterek idézőjelekben vannak. Karakterláncok és karakterek sora küldhető el egy utasításban, mindegyik előtte<< . All that will appear in one line at the output if ‘ ’ is not in the series.

gin

A cin a szabványos iostream bemeneti objektum, már példányosítva, és elérhető a standard könyvtárban. Tekintsük a következő kódszegmenst a main () függvényben:

chartxt[ötven];
költség << 'Írjon be egy szót, és nyomja meg az Enter billentyűt:' txt;
költség <<txt<<endl;

Az első utasítás 50 karakterből álló üres tömböt deklarál. A második utasítás utasítja a felhasználót, hogy írjon be egy szót a következő képernyősorba, és nyomja meg az Enter billentyűt. Vegye figyelembe az „endl” használatát, amely arra kényszeríti a felhasználót, hogy szöveget írjon be a képernyő következő sorába. Amint a felhasználó szöveget gépel, a bevitt szöveg visszhangzik a képernyőre, miközben a cin objektumba kerül. Az Enter megnyomása után a kódrészlet harmadik utasítása kerül végrehajtásra. Ez a harmadik utasítás elküldi a beírt szöveget a txt változónak. A beírt szöveg ebben az esetben nem lehet 50 karakternél hosszabb. Vegye figyelembe az elszívószerkezet használatát, >>. Az utolsó utasítás megjeleníti a képernyőn a beírt szöveget.

A cin egynél több szót vehet ki a billentyűzetről, szóközökkel elválasztva. Ezeket a szavakat különböző változókba kell bontani. A következő kódrészlet ezt szemlélteti:

chartxt[húsz];
intazt;
úszóft;
költség << 'Adjon meg 3 értéket, majd nyomja meg az Enter billentyűt:' txt>>azt>>ft;
költség <<txt<< '' <<azt<< '' <<ft<<endl;

Jegyezze meg az állítást:

gin >>txt>>azt>>ft;

Az első szót kibontja a txt -be, a mellette lévőt, az utolsót pedig ft -be. Ha a bemenet

egy25 3.6

akkor a kódszegmens kimenete a következő lenne:

egy25 3.6

cerr

A következő program hibát mutat:

#befoglalni
segítségével névtérórák;

intfő-()
{
a myInt -ben;

Visszatérés 0;
}

A main () első állítása nem helyes. Ha a kódot tartalmazó fájl neve temp.cc, és az így létrejövő futtatható fájl neve temp, akkor a következő g ++ parancs elküldi a fordító hibaüzenetét a fájlnak, error.txt:

g++ -o temp temp.DC 2>hiba.txt

Ha a error.txt fájl nem létezik, akkor létrejön. Jegyezze meg a g ++ parancs 2. részét> error.txt.

A képernyő a szabványos kimeneti célállomás, és egyben a szabványos hibahely is. Ha a 2> error.txt fájlt kihagyja a g ++ parancsból, akkor a fordító hibaüzenetét elküldi a szabványos hibahelyre, amely továbbra is a képernyő (monitor).

A szabványos kimeneti célállomást reprezentáló adatfolyam objektum a cout. Az adatfolyam objektum, amely a szokásos hiba célállomását képviseli, a cerr. A program futásidejű hibája a következőképpen küldhető a képernyőre:

cerr << 'A hibaüzenet!' << ' n';

klumpa

Egy alkalmazás különböző időpontokban különböző bemeneteket vesz fel. Minden bemenet újra megjeleníthető a képernyőn. Minden bemenet menthető egy fájlba. Ez naplózás. A szabványos naplózási cél a képernyő. A szabványos naplózási adatfolyam -objektum eltömődött. A következő kód ismét megjeleníti a beviteli szöveget a képernyőn:

chartxt[ötven];
költség<<'Írja be a szöveget, és nyomja meg az Enter billentyűt:'txt;
klumpa<<txt<<endl;

Ha a bemeneti szöveg 'input_text', akkor a clog újra megjeleníti az 'input_text' értéket a képernyőn.

A gyakorlatban a naplózást általában egy fájlba irányítják át. Az alábbi program ezt szemlélteti:

#befoglalni
segítségével névtérórák;

intfő-()
{
szabadon( 'log.txt','ban ben',stdout);

költség << 'input_text' <<endl;
}

Vegye figyelembe a freopen () függvény használatát és annak argumentumait. Az első érv a naplófájl neve. Ha a fájl nem létezik, akkor létrejön. Második érve az „írni” „w”. Harmadik érve a standard kimenet. A main () függvény második állítása a cout használatával küldi a naplózási szöveget a fájlba. Megjegyzés: A tényleges bemeneti kód nem jelenik meg ebben a programban.

Karakterek és karakterláncok beszerzése a billentyűzetről

Amíg a felhasználó begépeli a bemenetet, a karakterek a bemeneti adatfolyam pufferébe kerülnek, és megjelennek a képernyőn. Amikor a felhasználó megnyomja az Enter billentyűt, az összes karakter a pufferben van; továbbá a kurzor a következő sor elejére megy, a képernyőn. A program ezután a bemeneti olvasó utasítás után folytatja a következő programutasítást.

A cin objektumnak módszerei vannak, amelyekkel ez a rész foglalkozik.

Az első karakter olvasása

get (char_type & c):
A következő kódrészlet bemutatja, hogyan kell beolvasni az első karaktert a bemeneti adatfolyam pufferből:

charch;
költség << 'Beviteli szöveg:' <<endl;
gin.kap(ch);
költség <<ch<<endl;

Az első állítás hozzárendelés nélküli karaktert deklarál. A második utasítás utasítja a felhasználót, hogy írjon be egy karaktert. Amikor a felhasználó begépeli a karaktert, és megnyomja az Enter billentyűt, a harmadik utasítás a bemeneti folyam pufferből a karaktert a ch változóba másolja.

Még ha a felhasználó egynél több karaktert is beírt, az első karaktert a kódszegmens veszi át.

kap():
get () argumentum nélkül, a decimális ASCII kódot adja vissza. Tekintsük a következő kódrészletet:

költség << 'Beviteli szöveg:' <<endl;
költség << gin.kap() <<endl;

Ha a bemenet 'asdfg', akkor 97 -et adunk vissza, ami az 'a' decimális ASCII -kódja.

get (char_type* s, streamamsize n)

Miután a felhasználó beírt egy kifejezést és megnyomta az Enter billentyűt, az elsőtől kezdődő karakterek kinyerhetők a cin stream pufferből. A következő kód használható:

charo[10];
költség << 'Beviteli szöveg:' <<endl;
gin.kap(str,10);
költség <<o<<endl;

Ha a bemenet 'nagyszerű emberek', akkor a kimenet 'remek peo' lesz, 9 karakterből és nem 10. A string NUL karakter ( 0) a tizedik pozíciót foglalja el a get argumentumban. Tehát ahhoz, hogy 9 karakter legyen str -ban, a tárolási méretének legalább 10 -nek, a get () argumentumnak pedig 11 -nek kell lennie. a beírt karakterekből, plusz 1. Tehát, ha 12 karaktert ír be a teljes sorra, akkor a számnak 13 -nak kell lennie a karakterlánc (str) tárolási méretéhez és 13 -hoz a get () argumentumhoz. Vegye figyelembe, hogy egy szóköz egy karakternek számít.

get (char_type* s, streamamsize n, char_type delim)
Lehetőség van egy jobb oldali határolással rendelkező alstringet kinyerni egy adott karakter első előfordulásával vagy az alhúr karakterláncának áramlási méretével, amely mindig az első. Ha a következő kód bemeneti szövege nagyszerű emberek, akkor a nagyszerű lesz kivonva:

charo[30];
költség << 'Beviteli szöveg:' <<endl;
gin.kap(str,6,'vagy');
költség <<o<<endl;

A hatodik pozíció kezdettől fogva a szóköz, és kizárólag a kivont részsorozatot határolja. A hatodik pozíció az első az egyetlen karakter, az „o” előtt. Vegye figyelembe, hogy az str tárolási mérete a lehető legnagyobb lehet.

Ha a következő kód beviteli szövege nagyszerű emberek, akkor a gr kibontásra kerül:

charo[30];
költség << 'Beviteli szöveg:' <<endl;
gin.kap(str,10,'És');
költség <<o<<endl;

Az „e” első előfordulása a tizedik pozíció előtt következik be.

Egy vonal összes karakterének megszerzése

Az Enter billentyű megnyomása után a sorba beírt összes karakter a következő kód szerint látható:

költség << 'Beviteli szöveg:' <<endl;
míg (1) {
charch= (char)gin.kap();
költség <<ch;
ha (ch== ' n')
szünet;
}

A (char) billentyűvel történő átváltás minden tizedes számot a megfelelő ASCII karakterré alakít át.

kandikál()

A get () tagfüggvények nem csak a következő karaktert olvassák; eltávolítják a stream pufferből. A peek () tagfüggvény azonban egyszerűen beolvassa a következő karaktert (az elsőtől kezdve) anélkül, hogy eltávolítaná azt a pufferből. A következő kódban a get () függvény minden egyes karaktert először a peek () függvénnyel olvas ki, mielőtt eltávolítja. Mindez azután történik, hogy a felhasználó megnyomja az Enter billentyűt:

költség << 'Beviteli szöveg:' <<endl;
míg (1) {
charch= (char)gin.kandikál();
költség <<ch;
gin.kap();
ha (ch== ' n')
szünet;
}

Ha a következő karaktereket nem távolította el a get (), a peek () csak az első karaktert olvassa, és a ciklus végtelen ideig ismétlődik.

A karakterek megjelenítése és törlése az Enter megnyomása előtt

Vegye figyelembe, hogy a cin objektum esetén az Enter billentyűt le kell nyomni, mielőtt művelet történne. Nos, lehetséges, hogy karakterek jelennek meg gépelés és törlés közben, mielőtt megnyomja az Enter billentyűt. Ez azonban az operációs rendszerrel való kapcsolódást jelenti. Az operációs rendszerek különböznek. Ez tehát a különböző operációs rendszerek eltérő kódolását jelenti. Tehát ez a téma teljesen más oktatót érdemel - lásd később.

Karakterek és karakterláncok küldése a monitorra

A cout objektum egy kimeneti adatfolyam objektum, amely már példányosított és jelen van a C ++ szabványos könyvtárban. A cout a fő objektum, amelyet karakterek és karakterláncok küldésére használnak a monitorra. Ez a beszúró operátorral történik,<< . 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.

A skalárokat eredményező kifejezések érvek lehetnek a beszúrási operátor számára. Az operátor a skalárt szöveggé alakítja, és a szöveget a cout objektumfolyamba helyezi. Amikor szöveget küld a cout objektumnak, az általában megjelenik a képernyőn (monitoron). Időnként azonban előfordulhat, hogy nem jelenik meg azonnal. Ha szöveget kényszerít a képernyőre, közvetlenül a szöveg beszúrása után illessze be az endl speciális értéket. Ez azt eredményezi, hogy a szöveg a képernyőre kerül, és új sor kerül hozzáadásra. Megjegyzés: A „ n” egyszerűen új sort ad hozzá, de nem öblíti ki a szöveget a képernyőn.

A következő program bemutatja, hogyan kell kinyomtatni a képernyőre az int, float és a normál szöveg értékeit:

#befoglalni
segítségével névtérórák;

intfő-()
{
intazt= 5;
úszóft= 63,5;
költség << 'Az ' <<azt<< 'az elemek ára $' <<ft<< - USA. <<endl;

Visszatérés 0;
}

A kimenet:

Az5elemek ára $63,5MINKET.

A következő program bemutatja, hogyan nyomtatódik ki egy osztályból létrehozott objektum karakterlánca:

#befoglalni
segítségével névtérórák;

strukutca{
charo[tizenegy] = 'Néhány szó';
}obj;

intfő-()
{
költség <<obj.o << ' n';

Visszatérés 0;
}

A kimenet „néhány szó”.

C ++ program érvei

A program végrehajtása a fő () függvénytől kezdődik. A main () függvénynek valójában két opcionális paramétere van. A main () függvény szintaxisa az opcionális paraméterekkel a következő:

intfő-(intargc,char *argv[argc])
{

Visszatérés 0;
}

Tegyük fel, hogy a futtatható C ++ fájl neve temp. Tegyük fel, hogy a felhasználó által begépelt argumentumok a programnak a környezetéből (operációs rendszeréből) szükségesek,

cikkeket3könyv toll'nagy ház'

Itt 5 érv van: cikkek, 3, könyv, toll és nagy ház

Mindegyik szöveg. A program számozott érve a szöveg. Más szóval, minden argumentum egy karakterlánc. a nagy ház idézőjelben van, mert ez egy kifejezés. A terminálparancs a program futtatásához a következő lenne:

./ideiglenes cikkek3könyv toll'nagy ház'

Feltételezve, hogy a fájlhőmérséklet a saját könyvtárban van. Ne feledje, hogy a szóközök és nem vesszők választják el az argumentumokat.

Most a main () függvény szintaxisában az argc a programhoz tartozó argumentumok száma, plusz 1. Ebben az esetben a programhoz 5 argumentum tartozik. Tehát az argc 6. A szintaxisban az argv [argc] a karakterláncokra mutató mutatók tömbje. Az argv [0] tömb első értékét a fordító adja meg. Ez egy mutató a programfájl nevére. A többi érték mutató a program argumentumokra a felhasználó beírt sorrendjében. A tömb mérete argc. Ebben az esetben a méret 1 + 5 = 6.

Tegyük fel, hogy a fordítás során a következő program neve temp:

#befoglalni
segítségével névtérórák;

intfő-(intargc,char**argv)
{

költség <<argv[0] << ',' <<argv[1] << ',' <<argv[2] << ',' <<argv[3] << ',' <<argv[4] << ',' <<argv[5] <<endl;

Visszatérés 0;
}

Itt jegyezzük meg, hogy a 'char*argv [argc]' tömb 'char ** argv' -ként lett deklarálva.

Ha ezt a programot a terminál paranccsal futtatja,

./ideiglenes cikkek3könyv toll'nagy ház'

akkor a kimenet a következő lenne:

./hőmérséklet, cikkek,3, könyv, toll, nagy ház

Vegye figyelembe, hogy a könyvtár elérési útja szerepel a végrehajtható fájl nevében.

Ezenkívül vegye figyelembe, hogy a program futtatásakor (a program hívásakor) az argc értéke nem került elküldésre.

Következtetés

Az iostream osztálynak négy fontos objektuma van: cout, cin, cerr és clog. A cin egy bemeneti objektum, míg a többi kimeneti objektum. Amíg egy program fut, a program bemenete eltér a program futásának kezdő időpontjától. Amikor egy program futni kezd, a program bemenetét a program futtatására vonatkozó paranccsal egyesítik, szóközökkel elválasztva.