PB161 Programování v jazyce C++ Přednáška 5

Podobné dokumenty
PB přednáška (19. října 2015)

PB161 Programování v jazyce C++ Přednáška 6

PB161 Programování v jazyce C++ Přednáška 6

PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory

PB161 Programování v jazyce C++ Přednáška 9

PB161 Programování v jazyce C++ Přednáška 9

Prostory jmen. při vkládání několika hlavičkových souborů může vzniknout kolize. logika.h const int x=5; typedef struct {...

Datové proudy objektový vstup a výstup v C++

PB161 Programování v jazyce C++ Objektově Orientované Programování. Podzim 2014

Pokročilé programování v jazyce C pro chemiky (C3220) Vstup a výstup v C++

18. února 2015, Brno Připravil: David Procházka. Programovací jazyk C++

Vstupy a výstupy v jazyce C++

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Vstupní a vstupní proudy v C++

Jazyk C++, některá rozšíření oproti C

PB161 Programování v jazyce C++ Přednáška 8

PB161 Programování v jazyce C++ Přednáška 4

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

Práce se soubory. Základy programování 2 Tomáš Kühr

přetížení operátorů (o)

Zpracoval:

Úvod do programování. Lekce 1

Programování v C++ První kroky

PB161 Programování v jazyce C++ Přednáška 9

Programování v C++ 1, 5. cvičení

Úvod do programování. Lekce 3

PREPROCESOR POKRAČOVÁNÍ

Programování v C++ 1, 6. cvičení

PB161 Programování v jazyce C++ Přednáška 10

8. Načítání a zápis PDB souboru

přetížení operátorů (o)

Funkční objekty v C++.

SYSTÉMOVÉ PROGRAMOVÁNÍ Cvičení č.1

Abstraktní třídy, polymorfní struktury

for (int i = 0; i < sizeof(hodnoty) / sizeof(int); i++) { cout<<hodonoty[i]<< endl; } cin.get(); return 0; }

PB161 Programování v jazyce C++ Přednáška 10

C++ objektově orientovaná nadstavba programovacího jazyka C

PROGRAMOVÁNÍ V C++ URČENO PRO VZDĚLÁVÁNÍ V AKREDITOVANÝCH STUDIJNÍCH PROGRAMECH ROSTISLAV FOJTÍK

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

Programovací jazyk C++ Cvičení 2

Objektově orientované programování

Práce se soubory. Úvod do programování 2 Tomáš Kühr

Základy C++ I. Jan Hnilica Počítačové modelování 18

Programování v C++ 3, 3. cvičení

Práce se soubory. Úvod do programování 2 Tomáš Kühr

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

Objekty a třídy. Procedurální a objektově orientované programování. V této kapitole se naučíte: Procedurální a objektově orientované programování

PB161 Programování v jazyce C++ Přednáška 1

Zápis programu v jazyce C#

PB161 Programování v jazyku C++

PB161 Programování v jazyce C++ Přednáška 4

Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++

PB161 Programování v jazyce C++ Přednáška 1

PROGRAMOVÁNÍ V C++ CVIČENÍ

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

VISUAL BASIC. Práce se soubory

Dědění, polymorfismus

Programování v Javě I. Únor 2009

Mělká a hluboká kopie

Vector datový kontejner v C++.

Množina čísel int stl-set-int.cpp

Zpracoval:

Programování v Javě I. Leden 2008

Úvod do programovacích jazyků (Java)

Více o konstruktorech a destruktorech

Jazyk C++ I. Šablony 2

Standardní algoritmy v C++.

Syntaxe vyjímek. #include <iostream> #include <string> using namespace std; // Trida vyjimek class Vyjimka { private:

Řetězce. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

map, multimap - Asociativní pole v C++.

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

IB111 Úvod do programování skrze Python Přednáška 7

Jazyk C++ I. Polymorfismus

Šablony, kontejnery a iterátory

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Dnes samostatná norma ANSI jazyka C++ podobně jako u jazyka C

Programování v C++ 1, 17. cvičení

Základy programování (IZP)

Standardní algoritmy vyhledávací.

int => unsigned int => long => unsigned long => float => double => long double - tj. bude-li:

Šablony, kontejnery a iterátory

10. března 2015, Brno Připravil: David Procházka. Programovací jazyk C++

Úvod do programovacích jazyků (Java)

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

Dědičnost. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 23.března

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

PB přednáška (23. listopadu 2015)

Základy programování (IZP)

PB přednáška (26. října 2015)

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Motivace. Vstup a výstup. Minimální komunikace. Motivace. ÚDPJ - Vstup a výstup. Ing. Lumír Návrat katedra informatiky, A

Jazyk C# (seminář 5)

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Připravil: David Procházka. Programovací jazyk C++

Jazyk C++ 1. Blok 3 Objektové typy jazyka C++ Třída. Studijní cíl. Doba nutná k nastudování. Průvodce studiem

Druhy souborů. textové. binární. nestrukturované txt strukturované - ini, xml, csv. veřejné bmp, jpg, wav proprietární docx, cdr, psd

Jazyk C# a platforma.net

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

Transkript:

PB161 Programování v jazyce C++ Přednáška 5 Jmenné prostory Vstupní/výstupní proudy Nikola Beneš 19. října 2015 PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 1 / 29

Jmenné prostory PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 2 / 29

Motivace Problém: výskyt dvou entit se stejným jménem // library1.h class Object { /*... */ ; // library2.h class Object { /*... */ ; // main.cpp #include "library1.h" #include "library2.h" Při překladu main.cpp dojde k chybě: error: redefinition of class Object PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 3 / 29

Implicitní jmenné prostory int x; // double x; // CHYBA! class Example { float x; public: void method() const { double x; for (int i = 0; i < 3; ++i) { std::string x; { char x; ; PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 4 / 29

Implicitní jmenné prostory int x; globální jmenný prostor // double x; // CHYBA! class Example { float x; public: void method() const { double x; for (int i = 0; i < 3; ++i) { std::string x; { char x; ; PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 4 / 29

Implicitní jmenné prostory int x; globální jmenný prostor // double x; // CHYBA! class Example { jmenný prostor třídy Example float x; public: void method() const { double x; for (int i = 0; i < 3; ++i) { std::string x; { char x; ; PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 4 / 29

Implicitní jmenné prostory int x; globální jmenný prostor // double x; // CHYBA! class Example { jmenný prostor třídy Example float x; public: void method() const { jmenný prostor metody method double x; for (int i = 0; i < 3; ++i) { std::string x; { char x; ; PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 4 / 29

Implicitní jmenné prostory int x; globální jmenný prostor // double x; // CHYBA! class Example { jmenný prostor třídy Example float x; public: void method() const { jmenný prostor metody method double x; for (int i = 0; i < 3; ++i) { std::string x; jmenný prostor cyklu for { char x; jmenný prostor bloku ; PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 4 / 29

Jmenné prostory Přístup ke jmenným prostorům operátor :: int x = 17; class Example { int x; public: Example() : x(29) { void print() const { int x = 3; { int x = 9; cout << x << endl; // 9 cout << Example::x << endl; // 29 cout << ::x << endl; // 17 cout << x << endl; // 3 ; PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 5 / 29

Explicitní jmenné prostory Pojmenované jmenné prostory syntax: namespace jmeno {... namespace MyLib { void print(); namespace Experimental { // možno i vnořovat void print(); namespace MyLib { class Example { public: void print() const; ; [ukázka použití] PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 6 / 29

Explicitní jmenné prostory zpřístupnění Zpřístupnění jmenného prostoru plná kvalifikace std::string direktiva using namespace jmeno_prostoru; #include <string> string s; // CHYBA! void print() { using namespace std; string s; // OK int main() { string s; // CHYBA! PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 7 / 29

Explicitní jmenné prostory zpřístupnění (pokr.) deklarace using jmeno_prostoru::jmeno_entity má prioritu před using namespace #include "libadam.h" #include "libeve.h" using namespace Adam; // obsahuje funkci getapple(); using namespace Eve; // taky obsahuje getapple(); getapple(); // CHYBA! using Eve::getApple; getapple(); // OK, volá se Eve::getApple(); alias jmenného prostoru namespace SysWinWidget = System::Window::Widget; PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 8 / 29

Explicitní jmenné prostory zpřístupnění Používání using a using namespace v globálním prostoru užívejte rozumně nikdy v hlavičkových souborech vždy až po všech #include lokálně ve funkcích/metodách ve vnořených blocích není možno používat přímo uvnitř třídy (class scope) PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 9 / 29

Explicitní jmenné prostory použití Použití jmenných prostorů ve vlastních knihovnách: // cool_library.h #ifndef COOL_LIBRARY_H #define COOL_LIBRARY_H namespace cool_library { class Cool { /*... */ ; #endif PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 10 / 29

Explicitní jmenné prostory použití (pokr.) Oddělení kolidujících jmen při použití cizích knihoven: namespace Lib1 { #include "library1.h" // obsahuje třídu System namespace Lib2 { #include "library2.h" // obsahuje třídu System int main() { System s; // CHYBA! Lib1::System s1; // OK Lib2::System s2; // OK PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 11 / 29

Jmenné prostory další informace Další čtení pro zvídané http://en.cppreference.com/w/cpp/language/namespace http://en.cppreference.com/w/cpp/language/lookup qualified name lookup unqualified name lookup argument-dependent lookup namespace Test { int x; void print(int y) { int main() { print(x); // CHYBA! Test::print(x); // CHYBA! Test::print(Test::x); // OK print(test::x); // taky OK, argument-dependent lookup PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 12 / 29

Vstupní/výstupní proudy PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 13 / 29

Motivace Vstup a výstup z různých druhů zařízení soubory klávesnice, obrazovka (terminál) tiskárna, skener síťový socket Abstrakce konkrétního zařízení proudy (streams) data plynou proudem od zdroje k cíli využívá principů OOP PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 14 / 29

Hierarchie I/O proudů hierarchie umožňuje proudy s různými vlastnostmi proudy nelze kopírovat; proč? PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 15 / 29

Standardní vstup/výstup <iostream> Standardní instance cin standardní vstup, instance istream (stdin v C) cout standardní výstup, instance ostream (stdout v C) cerr standardní chybový výstup, instance ostream (stderr v C) clog standardní logovací výstup, instance ostream (stderr v C) rozdíl mezi cerr a clog: cerr nepoužívá vyrovnávací paměť (buffer) Speciální entity pro manipulaci proudů (manipulátory) např. endl vloží konec řádku a zároveň provede vyprázdnění bufferů PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 16 / 29

Vstup/výstup operátory Operátor výstupu << int x = 7; const double pi = 3.14; char cstring [] = " is "; cout << x << " + " << pi << cstring << x + pi << endl; // 7 + 3.14 is 10.14 pozor na prioritu PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 17 / 29

Vstup/výstup operátory Operátor výstupu << int x = 7; const double pi = 3.14; char cstring [] = " is "; cout << x << " + " << pi << cstring << x + pi << endl; // 7 + 3.14 is 10.14 pozor na prioritu přetížení << pro vlastní třídy ostream & operator<<(ostream & out, const Object & object); [ukázka: řetězení výstupů] přístup k private a protected atributům našeho objektu [ukázka: příklad] PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 17 / 29

Vstup/výstup operátory (pokr.) Operátor vstupu >> int x; double d; char cstring [50]; std::cin >> x >> d; std::cin >> cstring; // možná problém std::string s; std::cin >> s; // přečte jedno slovo ze vstupu PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 18 / 29

Vstup/výstup operátory (pokr.) Operátor vstupu >> int x; double d; char cstring [50]; std::cin >> x >> d; std::cin >> cstring; // možná problém std::string s; std::cin >> s; // přečte jedno slovo ze vstupu přetížení >> pro vlastní třídy istream & operator>>(istream & out, Object & object); přístup k private a protected atributům našeho objektu [ukázka: příklad] PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 18 / 29

Vstup/výstup chybové stavy Chybové stavy proudů proudy obsahují příznaky naznačující chybu eofbit, failbit, badbit metody pro testování stavu good(), fail(), eof() přetížené chování proudů jako bool, přetížený operátor! int x; cin >> x; if (cin) { /* načtení hodnoty do x se povedlo */ if (cin.good()) { /* načtení hodnoty se povedlo a není konec souboru */ metoda pro vyčištění příznaků: clear() http://en.cppreference.com/w/cpp/io/ios_base/iostate PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 19 / 29

Souborové proudy <fstream> Proudy pro vstup/výstup ze souborů třídy ifstream, ofstream, fstream konstruktor se jménem souboru, metody open() a close() #include <fstream> using namespace std; int main() { ofstream output("soubor.txt"); output << "Hello, world!\n"; output.close(); output.open("soubor2.txt"); output << 3.14 << endl; // o zavření se postará destruktor PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 20 / 29

Souborové proudy (pokr.) <fstream> Mód otevření souboru (nepovinný parametr konstruktoru) binární příznaky (flags), kombinujeme pomocí typ otevření ios::in (vstup, implicitní pro ifstream) ios::out (výstup, implicitní pro ofstream) ios::in ios::out (obojí, implicitní pro fstream) způsob otevření ios::binary (binární data, implicitní jsou textová data) ios::app (append, výstup na konec souboru) ios::trunc (vymaže soubor) více viz http://cppreference.com nebo http://cplusplus.com/reference hledejte ios a openmode [ukázka: příklad práce se soubory] PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 21 / 29

Třída istream operátor >> už známe metoda get() bez parametrů vrací jeden znak více znaků pomocí get(buffer, length) (čte do konce řádku) metoda getline(buffer, length) podobně jako get(), ale zahodí znak konce řádku ('\n) metoda read(buffer, count) blokové čtení daného počtu bytů hlavně pro binární soubory metoda gcount() počet znaků načtených při posledním vstupu metoda peek() náhled na další znak na vstup, bez jeho přečtení metoda ignore(count) zahodí count znaků ze vstupu a další viz reference na webu PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 22 / 29

Třída istream (pokr.) načtení řádku do řetězce typu std::string funkce getline(istream &, string &) std::string s; getline(std::cin,s); součást knihovny string, ne knihovny iostream PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 23 / 29

Třída ostream operátor << už známe metoda put() zapíše jeden znak metoda write(output, count) protiklad read() zápis na konci souboru soubor zvětšuje zápis uvnitř souboru soubor přepisuje PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 24 / 29

Pozice a posun v souboru odkud se čte, kam se zapisuje? get ukazatel (třída istream a její potomci) put ukazatel (třída ostream a její potomci) tellg(), tellp() získání pozice ukazatelů seekg(), seekp() nastavení pozice ukazatelů; dva parametry odkud: ios::beg začátek souboru ios::cur aktuální pozice ios::end (konec souboru) offset: o kolik se posunout od pozice odkud počáteční pozice v souboru závisí na módu otevření PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 25 / 29

Vyrovnávací buffery data poslaná do proudu nemusí být ihned zapsána do cíle vyrovnávací paměť typu streambuf pro každý proud přenos z vyrovnávací paměti do cíle při uzavření souboru (close(), destruktor) při zaplnění bufferu explicitně pomocí manipulátorů (endl, flush, sync, unitbuf) PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 26 / 29

Manipulátory <iostream>, <iomanip> speciální objekty, které je možno předávat operátorům << a >> flush vyprázdní buffer endl zapíše konec řádku a vyprázdní buffer dec, hex, oct změní způsob reprezentace čísel setw, setfill, setprecision mění formát vstupu a výstupu left, right mění zarovnání const double pi = 3.1415; cout << setw(10) << setfill('^') << left << setprecision(3) << pi << endl; // výstup: 3.14^^^^^^ http://en.cppreference.com/w/cpp/io/manip PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 27 / 29

Řetězcové proudy <sstream> Proudy dat v paměti třídy stringstream, istringstream, ostringstream konstruktor může brát řetězec počáteční stav proudu metoda str() nastaví obsah proudu bez parametrů vrací aktuální obsah proudu jako string [ukázka: příklad použití] PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 28 / 29

Shrnutí Jmenné prostory implicitní (lokální bloky, funkce, třídy, globální prostor) explicitní (namespace), mohou být vnořené zpřístupnění pomocí using namespace nebo using Vstupní/výstupní proudy abstrakce skutečných zařízení hierarchie standardní vstup/výstup souborový vstup/výstup vstup/výstup v paměti přetížené operátory << a >> další metody PB161 přednáška 5: jmenné prostory, vstupní/výstupní proudy 19. října 2015 29 / 29