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

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

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

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 6

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

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++

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

Vector datový kontejner v C++.

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

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

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

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

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

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

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

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

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

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

Šablony, kontejnery a iterátory

Vstupy a výstupy v jazyce C++

Konstruktory a destruktory

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

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

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

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

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

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Šablony, kontejnery a iterátory

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

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

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í

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 9

Abstraktní třídy, polymorfní struktury

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

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

Více o konstruktorech a destruktorech

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Úvod do programovacích jazyků (Java)

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Vstupní a vstupní proudy v C++

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

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

Zpracoval:

Dědění, polymorfismus

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

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

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

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

Zpracoval:

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

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

Úvod do programování. Lekce 1

Funkční objekty v C++.

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

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

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

Iterátory v C++. int pole[20]; for (int *temp = pole, temp!= &pole[20]; temp++) { *temp = 0;

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

PREPROCESOR POKRAČOVÁNÍ

Úvod do programování. Lekce 3

Objektové programování

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

Stručný obsah První týden Druhý týden 211 Třetí týden 451 Rejstřík 787

První kapitola úvod do problematiky

Programování v C++ První kroky

8 Třídy, objekty, metody, předávání argumentů metod

Mělká a hluboká kopie

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 1

Základy programování (IZP)

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

Zápis programu v jazyce C#

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

PŘETĚŽOVÁNÍ OPERÁTORŮ

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

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

IRAE 07/08 Přednáška č. 1

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

Ukazatele, dynamická alokace

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

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Jazyk C++ I. Šablony 2

Přetěžování operátorů

Abstraktní datové typy

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

C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19

Generické programování

OBJEKTOVÉ PROGRAMOVÁNÍ V C++ V PŘÍKLADECH 8 Proudová knihovna 8.1 Hierarchie proudů Standardně zavedené proudy

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

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

Jazyk C# (seminář 6)

7. Datové typy v Javě

Dynamická identifikace typů v C++.

Cvičení z programování v C++ ZS 2016/2017 Přemysl Čech

Množina v C++ (set, multiset).

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

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

Kolekce, cyklus foreach

Transkript:

Programování v jazyce C++ Objektově Orientované Programování Podzim 2014 Jmenné prostory, I/O proudy 1 Jmenné prostory, IO proudy 13.10.2014

Jmenné prostory 2 Jmenné prostory, IO proudy 13.10.2014

Jmenné prostory - motivace 1. Výskyt dvou entit (např. tříd) se stejným jménem většinou nenastane u našich vlastních tříd tam pohlídáme a přejmenujeme může ale nastat při použití dvou nezávislých knihoven které obsahují stejnou třídu 2. Chceme se preventivně tomuto problému vyhnout aby ostatní používající naši knihovnu neměli problém 3. Chceme používat knihovnu, která jmenné prostory už používá např. <iostream> 3 Jmenné prostory, IO proudy 13.10.2014

Jmenné prostory Způsob jak zamezit kolizím jmen entit ve dvou nezávisle vyvíjených kusech kódu Způsob jak omezit viditelnost jména entity třída, proměnná, funkce Některé jmenné prostory vznikají automaticky implicitní jmenné prostory, např. pro třídu Lze deklarovat vlastní jmenný prostor explicitní jmenné prostory 4 Jmenné prostory, IO proudy 13.10.2014

Implicitní jmenné prostory Vznikají automaticky při deklaraci tříd, struktur, metod, funkcí, cyklů uzavřeny mezi složené závorky { mohou být pojmenované nebo nepojmenované jm. prostor cyklu for class CTest { public: void print() const { for (int i = 0; i < 3; i++) { float test = 1; float test = 1; ; jm. prostor metody print() jmenný prostor třídy CTest globální jmenný prostor 5 Jmenné prostory, IO proudy 13.10.2014

Explicitní jmenné prostory Lze zavádět vlastní jmenné prostory Syntaxe: namespace MyNamespace { class CTest { public: void print() const { cout << "MyNamespace::CTest" << endl; ; deklarace začátku prostoru int main() { MyNamespace::CTest testobject1.print(); return 0; Jméno prostoru testobject1; Jmenné prostory mohou být vnořené MyName1:: MyName2::CTest 6 Jmenné prostory, IO proudy 13.10.2014

Zpřístupnění entit ze jmenného prostoru 1. Plná kvalifikace entity např. std::cout << "Test"; znáte už z implementace metod Person::getAge() { 2.using namespace jméno_prostoru; např. using namespace std; tzv. using-directive vloží obsah celého jmenného prostoru analogie Javovského import java.*; zvyšuje riziko jmenných konfliktů #include <iostream> int main() { std::cout << "Hello world"; std::cout << std::endl; return 0; #include <iostream> using namespace std; int main() { cout << "Hello world"; cout << endl; return 0; 7 Jmenné prostory, IO proudy 13.10.2014

Zpřístupnění entit ze jmenného prostoru (2) 3. using jméno_prostoru::jméno_entity; např. using std::cout; tzv. using-declaration vloží pouze odkazovanou entitu analogie Javovského import java.util.list; má prioritu před using namespace použijte až po všech #include #include <iostream> using std::cout; using std::endl; int main() { cout << "Hello world"; cout << endl; return 0; 8 Jmenné prostory, IO proudy 13.10.2014

Prevence před kolizí s jiným kódem #ifndef LIBRARY1_H #define LIBRARY1_H namespace Lib1 { class CSystem { public: void foo() { cout << "CSystem::foo" << endl; ; #include "library1.h" #endif // LIBRARY1_H #include "library2.h" int main() { Lib1::CSystem systemobject2; systemobject2.foo(); Lib2::CSystem systemobject3; systemobject3.otherfoo(); return 0; 9 Jmenné prostory, IO proudy 13.10.2014

Oddělení kolidujících jmen tříd #ifndef LIBRARY1_H #define LIBRARY1_H class CSystem { public: void foo() { cout << "CSystem::foo"; ; #endif // LIBRARY1_H namespace Lib1 { #include "library1.h" namespace Lib2 { #include "library2.h" #ifndef LIBRARY2_H #define LIBRARY2_H class CSystem { public: void otherfoo() { cout << "CSystem::otherFoo"; ; #endif // LIBRARY2_H int main() { //CSystem systemobject; // error: 'CSystem' was not declared Lib1::CSystem systemobject2; systemobject2.foo(); Lib2::CSystem systemobject3; systemobject3.otherfoo(); 10 return 0; Jmenné prostory, IO proudy 13.10.2014

Proudy, vstup a výstup 11 Jmenné prostory, IO proudy 13.10.2014

C++ I/O proudy Objektově orientovaná standardní knihovna C++ Poskytuje funkčnost pro vstup a výstup založenou na proudech Proud je abstrakce nějakého zařízení s možností vyčítat anebo vkládat položky (znaky,bajty ) data plynou proudem od zdroje k cíli zásobník na stisknuté znaky (klávesnice->obrazovka) soubor na disku (aplikace <->aplikace) tiskárna (aplikace ->tisková hlava) síťový socket (aplikace <-> vzdálená aplikace) 12 Jmenné prostory, IO proudy 13.10.2014

I/O proudy - hierarchie Základní objekty obsaženy v souboru <iostream> Hierarchie zavedena pro možnost kombinace i oddělení proudů s různými vlastnostmi a jejich specifické implementace 13 Jmenné prostory, IO proudy 13.10.2014

I/O proudy hierarchie (2) Základní předek je abstraktní třída ios_base využívá se často násobná dědičnost Třída typu istream ( input stream ) rozhraní pro vstupní proudy obsahuje operace pro získání existujících dat z proudu např. čtení ze standardního vstupu (cin >> prom;) Třída typu ostream ( output stream ) rozhraní pro výstupní proudy obsahuje operace pro zaslání nových dat do proudu např. výpis na standardní výstup (cout << Hello") Pozn. Proudy nelze kopírovat jako celek protože proud může být proměnný (např. vstup z klávesnice, kdy uživatel ještě nezadal svůj vstup) 14 Jmenné prostory, IO proudy 13.10.2014

Proudy pro standardní vstup a výstup Třídy obsaženy v hlavičkovém souboru <iostream> jmenný prostor std:: Několik proudů má i standardní instance (objekty) objekt cin standardní vstup, potomek istream (stdin v C) objekt cout standardní výstup, potomek ostream (stdout v C) objekt cerr chybový výstup, potomek ostream (stderr v C), clog Speciální funkce pro manipulaci proudů (manipulátory) vložení speciálních znaků známých z C (\n, \\,...) nastavení přesnosti a formátu dat způsob fungování interní cache http://www.cplusplus.com/reference/iostream/ 15 Jmenné prostory, IO proudy 13.10.2014

Proud cout (standardní výstup) Umožňuje zapsat data na (standardní) výstup Pro zápis se typicky využívá operátor << přetížen pro standardní typy, lze dodatečně i pro naši třídu #include <iostream> using std::cout; using std::endl; int na výstup int main() { int intvalue = 5; float floatvalue = 4.56; char charstring[] = " is "; cout << intvalue << " + " << floatvalue << charstring; cout << intvalue + floatvalue << endl; pole znaků na výstup return 0; fixní řetězec na výstup konec řádku na výstup 16 Jmenné prostory, IO proudy 13.10.2014

Proud cout další metody Operátor << můžeme přetížit i pro vlastní třídy asociace zleva doprava vrací referenci volajícího objektu - lze řetězit ve výrazu (je vhodné to samé dělat i pro vlastní operátory) cout << "Number: " << intvalue << ", string: " << charstring << endl; Členské metody pro vkládání znaků/hodnot zděděné z třídy ostream neformátované vkládání Vložená data mohou být ve vyrovnávací paměti (cache) explicitní vyprázdnění proudu pomocí flush() 17 Jmenné prostory, IO proudy 13.10.2014

Přetížení operátoru << - ukázka #include <iostream> using std::cout; using std::endl; using std::ostream; class CComplexNumber { float m_realpart; float m_imagpart; public: // ; // Make some operators my friends friend ostream& operator <<(ostream& out, const CComplexNumber& complex); Jmenné prostory, IO proudy 13.10.2014 int main() { CComplexNumber value1(10, 20); cout << value1 << endl; return 0; /** Output operator as friend function */ ostream& operator <<(ostream& out, const CComplexNumber& complex) { out << "[" << complex.m_realpart << ", " << complex.m_imagpart << "]"; return out; Přetěžování operátorů bude v další přednášce detailně. 18

Proud cin (standardní vstup) Umožňuje načíst data ze vstupu např. zadané z klávesnice, oddělená bílým znakem (enter, tab) načte se přímo do proměnné daného typu Využívá se typicky operátor >> přetížen pro standardní typy, lze dodatečně i pro naši třídu #include <iostream> using std::cout; using std::cin; using std::endl; hlavičkový soubor pro cin, cout, cerr přesměrujeme vstup do proměnné intvalue int main() { int intvalue = 0; char charstring[50]; cout << "Type number: "; přesměrujeme vstup do cin >> intvalue; proměnné charstring cout << endl << "Type string: "; cin >> charstring; // Note: Problem: if more then 49 characters are typed cout << "Number: " << intvalue << ", string: " << charstring << endl; return 0; Jmenné prostory, IO proudy 13.10.2014 19

Přetížení operátoru >> - ukázka #include <iostream> using std::cout; using std::cin; using std::endl; using std::istream; class CComplexNumber { float m_realpart; float m_imagpart; public: // ; // Make some operators my friends friend istream& operator >>(istream& in, CComplexNumber& complex); /** Input operator as friend function */ istream& operator >>(istream& in, CComplexNumber& complex) { if (in.good()) { in >> complex.m_realpart; in >> complex.m_imagpart; return in; Jmenné prostory, IO proudy 13.10.2014 int main() { CComplexNumber value1(10, 20); cout << value1 << endl; cin >> value1; cout << value1 << endl; return 0; Přetěžování operátorů bude v další přednášce detailně. 20

Proud cerr (chybový výstup) Proud pro zápis chybových hlášek Standardně přesměrován na cout, ale nemusí Způsob použití je stejný jako u cout je také potomek ostream #include <iostream> using std::cout; using std::cerr; using std::endl; int main() { cout << Hello world" << endl; cerr << Error: hell world" << endl; return 0; Jmenné prostory, IO proudy 13.10.2014 21

Chybové stavy proudů Proudy obsahují příznaky ukazující na chybu eofbit, failbit, badbit Lze využít operator! něco je špatně Metody pro testování stavu cin.good() cin.fail() cin.eof() Metody pro vyčištění příznaků cin.clear() 22 Jmenné prostory, IO proudy 13.10.2014

Proud cin řešení chybného vstupu Zadaný vstup nemusí být kompatibilní s cílovým typem #include <iostream> using Může std::cout; dojít k chybě na vstupu using std::cin; using std::endl; int main() { int intvalue = 0; cout << "Type number: "; cin >> intvalue; if(!cin.fail()) { // Process correct numerical value cout << "Good, you typed: " << intvalue << endl; else { // Process incorrect numerical value cout << "Problem, you typed non-numerical value." << endl; cin.clear(); return 0; otestujeme stav proudu po pokusu o vložení do intvalue po problému vyčistíme Jmenné prostory, IO proudy 13.10.2014 23

Souborové proudy 24 Jmenné prostory, IO proudy 13.10.2014

Myšlenka proudů abstrakce CComplexNumber number; cin >> number; cout << number; 25 Jmenné prostory, IO proudy 13.10.2014

Myšlenka proudů abstrakce CComplexNumber number; cin >> number; cout << number; 26 Jmenné prostory, IO proudy 13.10.2014

Operátory vstupu a výstupu Umožňují vložit resp. přijmout data z proudu (stream insertion resp. stream extraction) istream& operator >>(istream& in, CComplexNumber& complex) { in >> complex.m_realpart; in >> complex.m_imagpart; return in; ostream& operator <<(ostream& out, const CComplexNumber& complex) { out << "[" << complex.m_realpart << ", "; out << complex.m_imagpart << "]"; return out; 27 Jmenné prostory, IO proudy 13.10.2014

Jak překladač zpracuje proudy? Překladač hledá funkci se jménem 'operator <<' Operand nalevo udává 1. argumentu zde ostream (nebo potomek) Operand napravo udává typ 2. argumentu zde CComplexNumber CComplexNumber number; cout << number; ostream& operator <<(ostream& out, const CComplexNumber& complex); Proč reference &? nechceme vytvářet kopie objektů Proč const? CComplexNumber nebudeme měnit (kontrola, optimalizace) ostream naopak měnit budeme (vložení výpisu) => nemůže být const Proč vracet ostream? výstupem vyhodnocení cout << number; bude ostream lze řetězit: cout << number << number2 << endl; 28 Jmenné prostory, IO proudy 13.10.2014

Souborové proudy #include <fstream> http://www.cplusplus.com/reference/iostream/fstream/ díky dědičnosti můžete využívat známé chování z cin a cout 29 Jmenné prostory, IO proudy 13.10.2014

Souborové proudy ifstream/ofstream Proudy pro práci se soubory pokrývá funkčnost známou z C z knihovny <stdio.h> Potomci istream nebo ostream dědí běžné metody, které znáte u objektů z <iostream> ifstream pouze pro vstup ifstream infile( vstupni_soubor ); ofstream pouze pro výstup ofstream outfile( vystupni_soubor ); fstream pro vstup i výstup 30 Jmenné prostory, IO proudy 13.10.2014

ifstream/ostream/fstream Svázání s konkrétním souborem v konstruktoru: ofstream outfile( vystupni_soubor ); později metodou: outfile.open( vystupni_soubor ); Typ otevření ios::in (defaultní pro ifstream) ios::out (defaultní pro ofstream) ios::in ios::out (defaultní pro fstream) Způsob otevření ios::binary (binární přístup, default je textově) ios::append (přidání na konec, obsah se ponechá) ios::trunc (pokud soubor existuje, tak se vymaže) 31 Jmenné prostory, IO proudy 13.10.2014

Souborový proud elementární ukázka #include <stdio.h> int main() { FILE* file = NULL; char filename[] = "D:\\test.txt"; if ((file = fopen(filename, "r"))) { char value; while((value = getc(file))!= EOF) { putchar(value); fclose(file); Řešení pomocí jazyka C++ Jmenné prostory, IO proudy 13.10.2014 Řešení pomocí jazyka C #include <iostream> #include <fstream> using std::cout; int main() { std::ifstream infile("inputfile.txt"); if (infile.is_open()) { while (infile.good()) { cout << infile.get(); return 0; infile.close(); 32

Čtení ze souboru - třída istream Metoda get() čtení jednotlivých znaků včetně bílých znaků čtení více znaků pomocí get(buff, 30), ukončeno null přetížená metoda, hodně variant Metoda getline() jako get(), ale odstraní oddělovač z proudu 33 Jmenné prostory, IO proudy 13.10.2014

Čtení ze souboru - třída istream Použití operátoru vstupu >> infile >> value; Metoda read() blokové čtení daného počtu bajtů čte včetně bílých znaků využito hlavně u binárních souborů 34 Jmenné prostory, IO proudy 13.10.2014

Čtení ze souboru v cyklu ifstream infile("inputfile.txt", ios::binary); // open output file and truncate it already exists ofstream outfile("outputfile.txt", ios::binary ios::trunc); if (infile.is_open() && outfile.is_open()) { const int datalen = 100; char data[datalen]; while (infile.good()) { // read all available characters infile.read(data, datalen); int datareaded = infile.gcount(); outfile.write(data, datareaded); infile.close(); outfile.close(); 35 Jmenné prostory, IO proudy 13.10.2014

Zápis do souboru Použití operátoru výstupu << outfile << value; Metoda put() zápis jednotlivých znaků (včetně bílých znaků) Metoda write() blokový zápis daného počtu bajtů využito typicky u binárních souborů Při zápisu na konci se soubor zvětšuje Při zápisu uvnitř souboru se přepisuje! 36 Jmenné prostory, IO proudy 13.10.2014

Pozice a posun v souboru Odkud a kam se bude zapisovat? Get pointer místo, odkud se bude číst Put pointer místo, kam se bude zapisovat tellg(), tellp() získání pozice get/put ukazatele Nastavení pozice pro get ukazatel seekg seekg(offset, pozice_odkud); Pozice odkud ios::beg (začátek souboru), ios::cur (aktuální pozice), ios::end (konec souboru) Nastavení pozice pro put ukazatel seekp seekp(offset, pozice_odkud); Počáteční pozice ovlivněna módem otevření 37 Jmenné prostory, IO proudy 13.10.2014

Pozice v souboru - ukázka #include <iostream> #include <fstream> using std::cout; int main() { std::ifstream infile("inputfile.txt"); infile.open("inputfile.txt", ios::binary); if (infile.is_open()) { infile.seekg(0, ios::end); int datalen = infile.tellg(); cout << "Data length is: " << datalen << std::endl; return 0; 38 Jmenné prostory, IO proudy 13.10.2014

Ukončení práce se souborem V destruktoru objektu dochází k vyprázdnění vyrovnávacího pole a uzavření Explicitně metodou outfile.close(); objekt samotný nezaniká, lze se připojit k dalšímu souboru outfile.open(); 39 Jmenné prostory, IO proudy 13.10.2014

Problematika vyrovnávacího bufferu Data zaslaná do proudu nemusí být ihned zapsána do cíle není efektivní zapisovat každý bajt do souboru Pro každý souborový proud automaticky vzniká vyrovnávací pole typu streambuf Přenos ze vyrovnávací pole do cíle nastává: 1. při uzavření souboru 2. při zaplnění vyrovnávacího pole 3. explicitně pomocí manipulátorů nebo metod (endl, nounitbuf, flush, sync) 40 Jmenné prostory, IO proudy 13.10.2014

Využití souborových proudů - ukázky filedemo.cpp Otevření souboru Čtení a zápis do/ze souboru Vyprázdnění vyrovnávací paměti 41 Jmenné prostory, IO proudy 13.10.2014

Čtení/zápis do souboru - speciální Metoda ignore() zahodí jeden/několik znaků ze vstupu infile.ignore(7); Metoda putback() možnost využití namísto dat ze standardního vstupu v bash předplníme si vlastní data do standardního vstupu Metoda peek() náhled na další znak, např. testování konce EOF zůstává v proudu Metoda gcount() počet znaků načtených poslední operací (get, read) 42 Jmenné prostory, IO proudy 13.10.2014

#include <iostream> #include <fstream> using std::cout; int main() { std::ifstream infile("inputfile.txt"); if (infile.is_open()) { // peek for next char, but leave it in stream char c; while (((c = infile.peek())!= 't') &&!infile.eof()) { c = infile.get(); cout.put(c); cout.flush(); // discard two characters from input stream infile.ignore(2); return 0; // read rest of the remaining data from stream const int datalen = 100; char data[datalen]; while (infile.good()) { // read all available characters infile.getline(data, datalen); cout << data; infile.close(); 43 Jmenné prostory, IO proudy 13.10.2014

Řetězové proudy 44 Jmenné prostory, IO proudy 13.10.2014

Řetězové proudy #include <sstream> http://www.cplusplus.com/reference/iostream/stringstream proud používaný pro ukládání dat v paměti namísto souboru 45 Jmenné prostory, IO proudy 13.10.2014

Řetězové proudy základní chování Potomci istream, ostream a iostream jako pro souborové proudy dědí běžní chování proudů operátory vstupu a výstupu metody pro vkládání, vybírání a testování stavu proudu Proud je realizován v paměti jako: textový řetězec stringstream ss(ios::text); binární data stringstream ss(ios::binary); Lze jej transparentně nahradit např. za fstream operátory jsou přetížené pro istream resp. ostream 46 Jmenné prostory, IO proudy 13.10.2014

Jmenné prostory, IO proudy 13.10.2014

Řetězové proudy - inicializace 1. Proud s prázdným obsahem stringstream ss; 2. Proud pouze pro vstup resp. výstup istringstream resp. ostringstream stringstream(ios::in) resp. stringstream(ios::out) 3. Proud počátečně inicializovaný řetězcem stringstream ss("hello world"); 48 Jmenné prostory, IO proudy 13.10.2014

Řetězové proudy čtení a zápis Běžné operátory vstupu >> a výstupu << Běžné metody pro čtení a zápis (get(), write() ) Metoda stringstream::str() vrátí obsah proudu naformátovaného do std::string pozor na použití pro binární proudy (koncová nula) Metoda stringstream::str(const string &s) vloží řetězec do proudu 49 Jmenné prostory, IO proudy 13.10.2014

stringstream demo void stringstreamdemo() { stringstream ss("hello world"); string mystr; ss >> mystr; cout << mystr; ss >> mystr; cout << mystr; ss.clear(); ss.str("hello Dolly"); ss >> mystr; cout << mystr; ss >> mystr; cout << mystr; ss.clear(); ss.str(""); ss << "Hello Hero"; ss >> mystr; cout << mystr; ss >> mystr; cout << mystr; Jmenné prostory, IO proudy 13.10.2014 inicializace obsahu přes konstruktor inicializace obsahu přes str() clear() a str("") vyčistí příznaky a obsah proudu inicializace obsahu přes operator << 50

Jmenné prostory, IO proudy 13.10.2014

Proudy shrnutí 52 Jmenné prostory, IO proudy 13.10.2014

Běžný způsob využití proudů 1. Vytvoříme naši třídu s atributy 2. Překryjeme operátory vstupu >> a výstupu << používáme rozhranní istream resp. ostream 3. Implementujeme načtení resp. zobrazení atributů do proudu 4. Připojíme objekt na vstupní nebo výstupní proud např. cin, cout 5. Beze změn lze nahradit konkrétní vstupní nebo výstupní proud nahradíme např. za fstream nebo stringstream 53 Jmenné prostory, IO proudy 13.10.2014

class CComplexNumber { float m_realpart; float m_imagpart; public:... friend ostream& operator <<(ostream& out, const CComplexNumber& complex); friend istream& operator >>(istream& in, CComplexNumber& complex); ; // Output operator as friend function ostream& operator <<(ostream& out, const CComplexNumber& complex) { if (out.good()) { out << "[" << complex.m_realpart << ", " << complex.m_imagpart << "]"; return out; // Input operator as friend function istream& operator >>(istream& in, CComplexNumber& complex) { if (in.good()) { in >> complex.m_realpart; in >> complex.m_imagpart; return in; Jmenné prostory, IO proudy 13.10.2014

Problematika přístupového módu Jednotlivé třídy resp. metody mají defaultní hodnoty přístupového módu ifstream má automaticky ios::in ifstream ( const char * filename, ios_base::openmode mode = ios_base::in ); Explicitně specifikovaný mód přístupu může ovlivnit defaultní hodnotu záleží na konkrétní třídě a metodě např. ios::out u ifstream je ignorován (vždy zůstane in) např. problém s ios::binary u stringstream 55 Jmenné prostory, IO proudy 13.10.2014

std::list 56 Jmenné prostory, IO proudy 13.10.2014

Kontejner list Spojovaný seznam pro rychlé vkládání/odebírání používán velice často spojovaný seznam schránek jednotlivé schránky obsahují zvolený datový typ Nepřistupuje se přes index, ale pomocí iterátorů Syntaxe použití #include <list> int main() { std::list<int> mylist; return 0; 57 Jmenné prostory, IO proudy 13.10.2014

Kontejner list ukázka dokumentace Kam vložit. Za zadaný iterátor. Co vložit. Stejný datový typ s jakým je instance šablony vytvořena. Lze vložit i sekvence prvků zároveň. Od iterátoru first58 po dosažení iterátoru last. Jmenné prostory, IO proudy 13.10.2014

Kontejner list ukázka std::list<int> mylist; mylist.push_back(1); mylist.push_back(2); mylist.push_back(3); mylist.push_front(4); mylist.push_front(5); cout << "List size: " << mylist.size() << endl; // Use iterator to output all value in list std::list<int>::iterator iter; for (iter = mylist.begin(); iter!= mylist.end(); iter++) { cout << *iter << endl; iter = mylist.begin(); // get iterator to begin iter++; // jump to next item mylist.insert(iter, 10); // insert after this item mylist.clear(); cout << "List size: " << mylist.size() << endl; 59 Jmenné prostory, IO proudy 13.10.2014

Koloběh života objektu 60 Jmenné prostory, IO proudy 13.10.2014

Koloběh života objektu 1/2 1. Proces abstrakce (zapouzdření) Více konkrétních tiskáren, společné vlastnosti Vznik rozhraní IPrinter (čistě abstraktní třída) Píšeme kód, který pracuje na úrovni obecné tiskárny 2. Tvorba konkrétní třídy pro tiskárnu Implementujeme (virtuální) public funkce z rozhraní Přidáváme vlastní atributy a privátní funkce Přetížíme operátory vstupu >> a výstupu << class CHPDJ5550 : public IPrinter 3. Tvorba instancí třídy Typicky dynamická alokace new CHPDJ5550 Volá se konstruktor resp. konstruktory Jmenné prostory, IO proudy 13.10.2014

Koloběh života objektu 2/2 4. Práce s objektem Volání setteru, getteru, volání public metod objektu Kopírování objektu (kopírovací konstruktor) 5. Přetypování objektu Změna na jiný typ předka, často rozhraní (dědičnost) Volání metod rozhraní vede k implementaci z potomka (virtuální metody, polymorfismus) 6. Zánik objektu Objekt na zásobníku automaticky Objekt na haldě pomocí delete, příp. chytré ukazatele Volá se destruktor (vhodné mít virtuální destruktor) Jmenné prostory, IO proudy 13.10.2014

Shrnutí Jmenné prostory nevyhnete se jim, vznikají automaticky můžete zavádět svoje další dodatečně Proudy významný koncept využití dědičnosti a polymorfismu Souborové proudy pro práci se soubory dědí z iostream => známé operace 63 Jmenné prostory, IO proudy 13.10.2014

Bonus Jmenné prostory, IO proudy 13.10.2014

Jmenné prostory, IO proudy 13.10.2014

+ + + + = Jmenné prostory, IO proudy 13.10.2014

Klasický způsob vývoje Old-school styl vývoje Zadání rozděleno do dílčích problémů oddělených rozhraními Vývojáři pracují na separátních komponentách Separátní větve v SVN repozitářích Testy na úrovni dílčí komponenty Po nějaké době chceme provést spojení dílčích částí Stačí jen Merge & Compile? Integration hell přichází Rozhraní lehce upraveny Sdílený kód modifikován Chybné spojení během merge 67 Jmenné prostory, IO proudy 13.10.2014

Continuous integration (CI) Originálně navrženo pro Extreme Programming Nyní široce využíváno Složení více dobrých vývojových technik a postupů Celý produkt je stále připraven (night builds) Hlavní větev je spojena, kompilována a automaticky testována i několikrát denně CI server (Jenkins, Travis CI ) Versioning system (SVN, GIT ) Automatický build (make, Ant, Maven ) Automatické testy (unit testy, integrační testy) Dodatečná analýza (statická analýza, výkonostní testy ) Prezentace výsledků (grafický web ) 68 Jmenné prostory, IO proudy 13.10.2014

CI : GitHub + Travis CI + Create GitHub repository Create Makefile for automated build Sign into Travis-CI.org with GitHub account Add New Repository (button +) Your GitHub repositories are listed Activate GitHub Webhook for target repo Add.travis.yml file to root of your repo Fill content according your language and build process Trigger Travis build with Git push Results available at https://travis-ci.org/ and by email http://docs.travis-ci.com/user/getting-started/ language: cpp compiler: - gcc - clang script: make 69 Jmenné prostory, IO proudy 13.10.2014

+ 70 Jmenné prostory, IO proudy 13.10.2014

Coverity Velmi dobrý statický a dynamický analyzátor kódu Zdarma pro C/C++ & Java open-source projekty https://scan.coverity.com/ Lze integrovat s Travis CI https://scan.coverity.com/travis_ci + + 71 Jmenné prostory, IO proudy 13.10.2014

+ + 72 Jmenné prostory, IO proudy 13.10.2014