Anime illusztráció: C++ be- és kimenet – programozó lány, monitor előtt; cout « és cin » hangulatban

c++ alapok

C++ be- és kimenet alapjai

Ebben a leckében a C++ be és kimenet alapjait tanuljuk meg: hogyan írunk ki dolgokat a képernyőre std::cout-tal és hogyan olvasunk be adatokat a billentyűzetről std::cin-nel az iostream segítségével. Végigmegyünk azon, mi a különbség a ‘\n’ és a std::endl között, mikor miért jobb az egyik, miért harapja le a szóköz utáni részt a >> és hogyan oldja meg ezt az std::getline + std::ws / cin.ignore. 

A lecke célja, hogy a C++ be- és kimenet rutinszerű legyen: tudj számot és teljes nevet beolvasni, szépen formázva kiírni (pl. két tizedessel), és alap validitást csinálni (hibás input esetén törölni a hibajelzőt és kiüríteni a sort). A végén rövid, gyakorlati mini feladatokkal zárunk, hogy azonnal be is gyakorold. 

Kiírás (std::cout)

Gyors kezdés: szöveg, szám, kifejezés

C++ be- és kimenet: cout példák – változó értékének és kifejezésnek a kiírása Dev-C++ konzolra ('Szamoljunk', x és 2*x)

Mi az az std?

A standard library (szabványkönyvtár) dobozcímkéje, hivatalosan névtér (namespace). A könyvtárban rengeteg név van (cout, cin, string, vector …), és hogy ne ütközzenek a te saját neveiddel, előtte kiírjuk, hogy std:: – így jelezzük a fordítónak, hogy ezt a nevet a standard könyvtárból szeretném. 

Mi az a cout

A cout egy előre elkészített objektum a szabványkönyvtárban, amely a szabványos kimenetre (konzol/ablak) ír. Console output. Nekünk most elég annyi, hogy ez az a dolog, amivel kiírunk valamit a képernyőre. 

Mi a <<?

A << „folyamba helyezés” operátora. Jelentése: tedd be ezt az adatot a kimeneti folyamba, balról jobbra dolgozik és láncolható: 

C++ be- és kimenet: std::cout több hívással, std::endl és szöveg kiírása – láncolás nélkül.

Mind a két esetben ugyanaz lesz a kiírás – nem kell külön sorba újra kiíri az std::cout sort, elég csak ezzel << az operátorral felsorolni és a legvégét lezárni egy pontosvesszővel. 

Új sor: std::endl vs 'n'

Mit csinálnak?

  • ‘\n’ – egy új sor karakter. Simán sortörést jelent
  • std::endl sort tör és mellette kiüríti a kimeneti puffert is. Ez akkor fontos, ha azonnal látni akarod a kiírást. 

Mikor melyiket érdemes használni?
Alapból használd az ‘\n’ -t, mert gyorsabb, de ha biztosra akarsz menni, hogy a szöveg rögtön megjelenjen, akkor std::endl

Bemenet: std::cin

Gondolj az std::cin-re úgy, mint egy futószalagra (pufferre), amin karakterek érkeznek. 

  • A >> operátor a whitespace-ig (szóköz/Enter/Tab) olvas egy darabot.
  • A getline Enterig olvas teljes sort (szóközökkel együtt)
  • A get egy darab karaktert vesz le – akár szóközt vagy Entert is

Hova tegyük az adatot? 

Szöveget std::string-be, számot int/double-ba teszünk. A változónév lehet betű, szám, alsóvonás, de nem kezdődhet számmal és nem lehet kulcsszó (pl. int, double, return stb.)

Mi történt itt? Csak a vezetéknevet vette be, mert a >> az első szóközig olvasott csak. Ha szeretnénk mind az egész sort megjeleníteni, akkor a megoldás az std::getline lesz

Számok beolvasása (int, double)

Az >> operátor szóközig olvas és rögtön megpróbálja átalakítani az értéket a cél típusára

Több adatot egymás után is bekérhetsz egy sorban – a >>-t mindegy, hogy szóköz, tab, vagy Enter választja el 

Szóköz és Enter csapdák: std::ws és std::cin.ignore

Képzeld el a bemenetet (stdin) egy futószalagnak. Az >> operátor szóközig olvas (szóköz, Enter, Tab = whitespace), a soron következő whitespace-t pedig rajtahagyja a szalagon. Ezért van az, hogy szám beolvasása után egy std::getline néha üres sort kap: az előző Enter még ott csücsül elől. 

Két egyszerű eszközünk van erre: 

1.) std::ws – „whitespace-porszívó”

Az std::ws felfalja az elején álló whitespace-eket (Entert is)

Mikor jó? 
Ha >> után egyból sorbeolvasás (getline) jön vagy ha nem baj, hogy minden kezdő szóközt is elnyel (pl. a felhasználó véletlenül beütött pár space-t)

 

2. std::cin.ignore

Az ignore kifejezetten arra való, hogy eldobjunk karaktereket a puffer elejéről. Klasszikus minta: dobt el a teljes sor maradékát (az Enterig), aztán olass getline-nel

Mikor jó? 

Ha biztosan a sor végét szeretnéd kidobni (pl. >> után jön még egy getline, vagy ha a menüben/űrlapon szeretnéd letisztítani a sort egy rövid karakteres input után.  

C++ be- és kimenet: cin.ignore() és std::getline() példa – az Enter eldobása, hogy ne kapjunk üres sort

Mi történik? 

Nem a számot dobjuk el, hanem azt, ami utána marad a pufferben – tipikusan az Entert, esetleges szóközöket, maradék karaktereket. Mindig van eldobnivaló amikor >>-val olvasol, mert a >> csak a tokenig eszik, a leválasztó (whitespace, ‘\n’) bent marad. 
Tehát: írsz valamit, Entert nyomsz: akkor beírod: 5 + Enter
A pufferbe kerül [‘5’] [‘\n’]
beírod: int darab;
std::cin >> darab //megeszi az ‘5’-öt, a pufferben marad: [‘\n’] 
Ha most rögtön jönne a std::getline(…), az az első karakterig a sor végéig olvas. De az első karakter már a ‘\n’, ezért üres sort kapsz. Ezeket ignoráljuk. Eldob mindent a sor végéig, beleértve az ‘\n’-t is, így az std::getline a következő sort kapja meg, nem az üreset. 

Ha nagyon röviden kéne megfogalmazni: >> meghagyja a leválasztót, a maradékot el kell dobni. std::getline sorig olvas, ha elsőnek ‘\n’ van, üres lesz

Mikor használj std::ws-t és mikor std::cin.ignore-t?

Ha csak Enter maradt elől -> std::ws. Elég csak egy whitespace kiszippantása.
Ha a sorban maradék szöveg is lehet, akkor használd az ignore(…, ‘\n’) -t

 

Puskasor – C++ be és kimenet

  • std::cout << ... → kiírás. Láncolható. '\n' gyors newline, std::endl newline + puffer ürítés.

  • std::cin >> x → whitespace-ig olvas és konvertál 

  • std::getline(std::cin, s) → teljes sor az Enterig (szóközökkel együtt).

  • >> után getline előtt: ignore(..., '\n') vagy getline(std::cin >> std::ws, s).

 

Mi jön ezután?

A következő fejezetben a változókról és típusokról beszélünk (egész, valós, karakter, szöveg; névadás, alapértelmezett értékek, típuskonverziók, const), hogy a most beolvasott értékeket jól tudjuk tárolni és számolni velük.

Lecke vége: anime lány V-jelet mutat, laptopon Visual Studio Code, mellette bögre tea és alvó cirmos macska, konfettivel.

Ha máshol szeretnéd folytatni a C++ tanulást, itt válogathatsz

C++ változók és adattípusok

C++ változók és adattípusok

Eddig főként szöveggel dolgoztunk - most itt az idő, hogy számokat is tároljunk, számoljunk és mérjünk! A számítógép minden adatot a memóriájában tárol. Ez a memória apró bitekből, bájtokból áll. 1 bájt = 8 bit Egy bit lehet 0 vagy 1, tehát egyetlen biten kétféle...

bővebben
C++ – Operátorok

C++ – Operátorok

Eddig már megtanultuk, hogyan tároljunk értéket változókban - most pedig megtanuljuk, hogyan számoljunk velük! A C++ igazi ereje abban rejlik, hogy a memóriában tárolt értékekkel műveleteket tudunk végezni: összeadni, kivonni, osztani, hasonlítani, logikai döntéseket...

bővebben
C++ alapok: main függvény, programváz

C++ alapok: main függvény, programváz

Mielőtt belevágnánk a C++ témába, rakjunk rendet: mi az a forrásfájl, a C++ main függvény, hogyan néz ki a programváz, mik azok a headerek (#include <...>) és mit ad a C++ stardard library. Ha a környezeted még nincs kész, itt a két útmutató hozzá:– Dev-C++...

bővebben