Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
C/C++
Vstupní a výstupní operace pomocí datových proudů v C++
9. dubna 2001, 00.00 | V tomto článku si ukážeme jak pracovat se vstupním a výstupním zařízením v C++. Objasníme si význam objektů cin, cout, cerr. Podíváme se na datové proudy, třídu ios a její potomky. Ukážeme si také manipulátory a jak formátovat výstup.
Vstupní a výstupní operace pomocí datových proudů v C++V tomto článku si ukážeme jak pracovat se vstupem a výstupem v C++. V grafických operačních systémech se již standardní vstup a výstup příliš nepoužívá. Přesto je dobré tyto možnosti znát. Standardní vstup a výstup se používá například v CGI (O C++ a CGI v tomto seriálu také jednou budu psát.) a také mnohdy v Unixových OS pří psaní filtrů.
Každý, kdo čte mé články, si určitě všimnul, že pro výpis na stdout nepoužívám knihovnu jazyka C - stdio, ale používám iostream. V C++ lze také používat knihovnu stdio, já bych ale doporučoval používat iostream, na jejíž výhody bych chtěl v tomto článku poukázat.
Datový proudDatový proud je reprezentován abstraktní (velmi abstraktní) třídou ios. Datový proud reprezentuje vždy nějaký "přesun" dat (plynutí dat, nebo proud dat) od zdroje k cíli. Ze třídy ios dědí další třídy jako například istream (vstupní proud), ostream (výstupní proud), fstreambase (datové proudy pro soubory), strstreambase (paměťové datové proudy pro řetězce). U tříd dědících z ios je naprosto běžná vícenásobná dědičnost. Třídy mají mnoho metod, které zde nebudu vypisovat. Lze je najít v každé dokumentaci, nebo i v hlavičkovém souboru iostream.h . V hlavičce iostream.h jsou definovány objekty cout, cin, cerr . Právě ty pro nás budou nyní důležité.
název objektu | je instance třídy | datový prou pro | v jazyce C |
cout | ostream | výstup | stdout |
cin | istream | vstup | stdin |
cerr | ostream | chybový výstup | stderr |
Třída ostream má přetížený operátor << (operátor bitového posunu) pro všechny primitivní datové typy a také pro pole char, tedy vlastně pro řetězce. Význam tohoto operátoru je poslat svůj pravý operand do datového proudu, který je levým operandem. Operátor << vrací referenci na instanci ostream, takže je možné operátory << dávat "za sebe". Vše si můžeme ukázat na následujícím příkladu, kdy pošleme nějaká data proudem na stdout a stderr.
|
Výraz cout << a vrací opět cout (referenci). Proto je možné napsat cout << a << c. Důvody proč používat proudy místo funkcí z jazyka C mě napadají dva:
Manipulátory, jak již sám název napovídá, slouží k manipulaci s proudem. Jeden manipulátor již dlouho bez vysvětlení používám. Jedná se o manipulátor endl . Význam některých manipulátorů ukážu v tabulce:
Manipulátor | Význam |
endl | Vloží konec řádku a vyprázdní buffer (vyrovnávací paměť) proudu. |
flush | Vyprázdní buffer proudu. |
setw | Minimální počet znaků pro vypsání hodnoty. Tento manipulátor má jeden celočíselný parametr. |
dec | Výpis čísel bude v desítkové soustavě. |
oct | Výpis čísel bude v osmičkové soustavě. |
hex | Výpis čísel bude v šestnáctkové soustavě. |
setfill | Tento manipulátor má 1 parametr. Určuje jakým znakem bude vyplňováno volné místo, je-li nastaveno setw. |
Doporučuji Vám používat raději manipulátor endl, než posílat na proud znak '\n', protože endl také vyprázdní buffer. Použijete-li nějaký manipulátor s parametrem, musíte vložit hlavičkový soubor iomanip.h . Použití manipulátorů si ukážeme na následujícím příkladě:
|
Jak vidíme, manipulátory s parametrem "platí" jen do dalšího odeslání dat na cout. Pro každý manipulátor s parametrem je k dispozici metoda, která provede to samé. Například místo cout << setw(6); lze napsat cout.width(6); .
Opomenuli jsme objekt cin. Tento objekt reprezentuje datový proud "spojený" se standardním vstupem. Jak asi mnohé napadne třída istream má přetížený operátor >> pro vstup. Pravý operand operátoru je instance třídy istream a levý operand je proměnná, která má přijmout data. Operátor >> je přetížen pro všechny primitivní datové typy i pro pole znaků. U pole znaků může nastat jen jeden "malý" problém. Operátor >> čte znaky jen do prvního bílého znaku. Bílý znak je v tomto případě i mezera. Tedy stejný problém, jako když funkce scanf z jazyka C čte řetězec. Celý řádek lze přečíst pomocí metody istream& getline(char*, int, char = '\n') , kde první parametr je řetězec, druhý parametr je maximální počet znaků a třetí parametr je ukončovač řádku, jehož implicitní hodnota je '\n'. Použití ukážu na příkladu:
|
Tolik tedy k úvodu. Možná jsem Vás ještě nepřesvědčil o používání proudů místo funkci z stdio. Výhoda proudů se projeví hlavně při přetěžování operátorů << >> pro uživatelské datové typy a třídy. O tom jak tyto operátory přetěžovat, a také jak pracovat s textovými soubory, si povíme v příštím článku.
Obsah seriálu (více o seriálu):
- Základy OOP v C++: Od C k C++
- Základní pojmy objektově orientovaného programování
- Vytváření tříd, instance třídy, zasílání zpráv v C++
- Vytváření instancí - konstruktory, destruktory
- Kopírovací konstruktor v C++
- Jednoduchá dědičnost v C++
- Časná versus pozdní vazba - úvod do polymorfismu v C++
- Polymorfismus - dokončení
- Vícenásobná dědičnost v C++
- Vícenásobná dědičnost v C++ - opakovaná dědičnost
- Vícenásobná dědičnost v C++ - volání konstruktorů a destruktorů
- Přetěžování operátorů v C++ 1.díl
- Přetěžování operátorů v C++ 2. díl
- Vstupní a výstupní operace pomocí datových proudů v C++
- Přetěžování operátorů << a >> pro datové proudy v C++
- Neformátovaný vstup a výstup v C++
- Paměťové proudy v C++
- Prostory jmen v C++
- Řetězce v C++
- Výjimky v C++
- Výjimky v C++ - výjimky tvoří dědičnou hierarchii
- Výjimky v C++ - dokončení
- Dynamická identifikace typů v C++
- Přetypování v C++
- Problémy s typy při vícenásobné dědičnosti
- Šablony funkcí v C++
- Šablony datových typů v C++
- Vnitřní typy u parametrů šablon, vnořené šablony v C++
- Pole s libovolným intervalem indexování v C++
- Datové kontejnery v C++ - Úvod do STL
- Vector - datový kontejner v C++
- Iterátory v C++
- Šablona vector v C++ a iterátory
- Asociativní pole v C++
- Množina v C++
- Funkční objekty v C++
- Standardní funkční objekty v C++
- Úvod do standardních algoritmů v C++
- Kopírovací a přesouvací algoritmy v C++
- Vyhledávací algoritmy v C++
- Skenovací (prohlížecí) algoritmy v C++
- Transformační algoritmy v C++
- Řadící algoritmy v C++
- Halda v C++
- Standardní algoritmy v C++ - dokončení
- Automatické ukazatele v C++
- Inteligentní ukazatel - čítač referencí v C++
- Použití čítače referencí v C++
- Kopírování velkých objektů v C++
- Řízené kopírování prvků v poli v C++
- Dokončení seriálu objektově orientované programování v C++
Diskuse k článku
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007