Cin je v hierarchickom zaradení objektom triedy istream. Objekty cin a cout tvoria základné kamene vstupu a výstupu jazyka C++. Podobne ako objekt cout aj objekt cin chápe vstup ako prúd bajtov. Cin používa
operátor bitového posunu >>, teda cin >>. Pre používanie objektu cin treba deklarovať v programe hlavičkový súbor príkazom
#include <iostream>.
Rozdiely a podobnosti medzi cin >> a scanf ()
1. Syntax Jazyk C používal pre štandardný vstup z klávesnice príkaz scanf (), ktorý obsahoval okrem iného aj opätovné určenie dátového typu, ktorý chceme načítavať. Okrem iného príkaz scanf () tvorí zložitejší syntax, ktorý je vždy nutné písať.
int a;
scanf("%d",&a);
Pri použití objektu cin v jazyku C++ odpadá zložitý syntax. Objekt cin sa riadi deklaráciou premennej, do ktorej obsahu má načítavať dáta a nepotrebuje žiadne ďalšie určenie, ako je to v prípade funkcie scanf ().
int a;
std::cin >> a;
2. Viacnásobné načítavanie
int i;
char s[20];
int d;
V jazyku C++ poskytuje objekt cin skutočne jednoduché viacnásobné načítavanie. Nepotrebujeme prekladaču udávať, o aký dátový typ ideme načítavať, ale len zoradíme mená premenných a pospájame operátorom bitového posunu - <<. Viacnásobné načítavanie je veľmi podobné pri použití objektu cin a metódy scanf. Jediným, ale zato podstatným rozdielom, je spomínaná nutnosť udávania parametrov premenných pri použití funkcie
scanf (). Tento spôsob je podobný, ako pri
scanf (), len bez udávania parametrov dátových typov.
std::cout <<"zadajte cislo, retazec a cislo" << std::endl;
std::cin >> i >> s >> d;
printf("zadajte cislo, retazec a cislo");
scanf("%d%s%d",&i, s, &d);
Absencia udávania parametra načítavanej premennej je hlavným rozdielom týchto dvoch spôsobov načítavania dát do programu. Čo sa týka funkčnosti, tak sú
cin a s
canf () takmer totožné a nemožno ich z tohto hľadiska posudzovať. Objekty cin a cout sú krokom vpred k objektovo orientovanému programovaniu a sú viac škáľovatelné a dajú sa lepšie prispôsobiť konkrétnemu použitiu ako
printf () a
scanf (). Objekty
cin a
cout dedia od nadradených tried metódy, takže nie sú len novšie, ale obsahujú aj kvalitnejšie a širšie možnosti.
Objekt cin pri vstupe porovnáva deklarácia premennej, do ktorej načítavame a vstupné dáta s prototypmi, ktoré obsahuje hlavičkový súbor iostream. Toto porovnávanie a vstup sa zvykne označovať ako
formátovaný vstup. Pojem neformátovaný vstup si vysvetlíme nižšie. Definované prototypy sú :
signed char, unsigned char, short, char, int, unsigned short, long, unsigned int, flout, double, long double a unsigned long.
Prejdeme k zaujímavejším úkonom s objektom cin, a tým sú zdedené metódy od triedy istream.
Metóda get () Táto metóda má veľmi široké použitie a záleží len aké parametre v nej použijeme. Povieme si o dvoch jej využitiach, pretože ostatné patria do kapitoly vstup a výstup do súborov. Touto kapitolou sa budeme zaoberať neskôr a k funkciám metódy get () sa ešte vrátime.
1. Použitie – načítavanie bloku dát Metóda get () sa dá použiť na
načítanie celého riadku textu, vrátane medzier. Ide o neformátovaný vstup. Pri tomto použití musí funkcia
get () obsahovať 2 parametre. Jeden označuje miesto, kam budeme načítavať, t.j. pole znakov. Druhý parameter je číslo, ktoré hovorí koľko znakov sa má načítať. Pochopiteľne musí byť toto číslo menšie alebo rovné, ako je veľkosť poľa znakov. Dôležitou informáciou je, že metóda
get () ponecháva znak pre nový riadok vo vstupnom prúde a tento znak bude prvým, ktorým sa začne ďalší vstup.
char text[50];
std::cout <<"zadajte text" << std::endl;
std::cin.get(text,50);
std::cout << text;
Vstup: Jazyk C++ nám dáva mocné nástroje
Výstup: Jazyk C++ nám dáva mocné nástroje
2. Použitie – načítavanie jedného znaku Druhé použitie metódy
get (), o ktorom si povieme spočíva v načítavaní jedného znaku. Parameter metódy je v tomto prípade iba premenná typu char. Funkcia
get () predstavuje
neformátovaný vstup, pretože znak medzery pre ňu nepredstavuje žiadne obmedzenie, ale berie ho ako normálny znak.
char ch;
std::cout <<"zadajte znak" << std::endl;
std::cin.get(ch);
std::cout << ch;
Vstup: A
Výstup: A
Metóda getline () Názov tejto metódy sám za seba vysvetľuje funkčnosť tejto metódy. Podobne ako metóda
get () aj metóda
getline () predstavuje neformátovaný vstup. Metóda načítava celý riadok, s medzerami a všetkými znakmi. Líši sa od funkcie get () tým, že znak pre nový riadok zo vstupného prúdu vyextrahuje/vytiahne. Pri použití obsahuje 2 parametre, presne rovnaké, ako u prvej verzie metódy get ().
char riadok[50];
std::cout <<"zadajte text" << std::endl;
std::cin.getline(riadok,50);
std::cout << riadok;
Metóda ignore () Táto metóda slúži k doladeniu dvoch vyššie uvedených. Jej použitím dosiahneme, aby bolo od začiatku načítavania ignorovaných n znakov.
char riadok[50];
std::cout <<"zadajte text" << std::endl;
std::cin.ignore(10);
std::cin.getline(riadok,50);
std::cout << riadok;
Vstup: Programovanie je zábavné
Výstup: nie je zábavné
Metóda read () Táto metóda sa používa často spoločne s metódou write () pri zápise/čítaní dát zo súboru.
Načítava blok textu, takže ju možno zaradiť medzi metódy
neformátovaného vstupu. Jej funkčnosť je totožná s metódou get () pri použití načítavania bloku dát. Rozdielom je, že neumiestni na koniec načítavaného bloku dát ukončovací znak, to znamená, že vstup neprevádza na reťazec v pravom zmysle slova.
char r[50];
std::cin.read(r,50);
Metóda peek () Táto metóda vám umožní
pozrieť si nesledujúci znak, ale ona sama ho nenačíta. To znamená, že ide o akúsi kontrolu načítavania, bez jeho ovplyvnenia. Metóda
peek () sa najčastejšie využíva spolu s podmienkami
if, else, alebo cyklom
while pri rozhodovaní, či budeme , alebo nebudeme pokračovať v načítavaní.
char c;
c = std::cin.peek();
Metóda gcount () Slúži na zistenie počtu načítaných znakov neformátovaného vstupu. To znamená, že ak načítavame text do poľa s určitou veľkosťou a zaujíma nás, aká časť z neho je zaplnená, resp.
koľko znakov sa skutočne načítalo a zaplnilo pole, táto metóda nám na to dá odpoveď. Metóda spolupracuje s metódami triedy istream pre neformátovaný vstup –
get (), getline (), read (), ignore (). Väčšina prekladačov má problémy so spočítavaním znakov pri použití metódy read ().
int c = 0;
std::cin.get(r,50);
c = std::cin.gcount();
Metóda putback () Slúži na vrátenie znaku späť do vstupného prúdu. Po tomto vrátení bude načítavanie pokračovať od tohto vrátaného znaku. Metóda neumožňuje len vrátenie načítaného znaku, ale aj akéhokoľvek iného znaku. Toto je možné využiť pri upravovaní načítavaného zdroja.
char c;
char b;
for(int i = 0; i < 3; i++){
c = std::cin.get();
}
std::cin.putback(c); //namiesto c by tu mohlo byť napr. ‘A’,
//alebo iný znak
b = std::cin.get(); //ktorý chceme vrátiť do vstupného reťazca
Metódy
tellg () a seekg () si predstavíme v kapitolách vstup a výstup do súboru.
V ďalšom pokračovaní si objasníme detaily ohľadom toho, ako sa objekt cin správa k prúdom.
Súvisiace články
Prehľad všetkých dielov