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



Podobné dokumenty
Pokročilé programování v jazyce C pro chemiky (C3220) Dědičnost tříd v C++

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

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

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

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

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 {...

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

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

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

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

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

Programování v jazyce C pro chemiky (C2160) 5. Čtení dat ze souboru

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

Pokročilé programování v jazyce C pro chemiky (C3220) Úvod do jazyka C++

Funkční objekty v C++.

Vstupní a vstupní proudy v C++

Programování v jazyce C pro chemiky (C2160) 4. Textové řetězce, zápis dat do souboru

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

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. November 16, 2017

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

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

Základy programování (IZP)

Programování v C++ První kroky

Programování v jazyce C pro chemiky (C2160) 6. Funkce, struktury

Úvod do programování. Lekce 3

Vector datový kontejner v C++.

Operační systémy. Cvičení 4: Programování v C pod Unixem

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

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

Základy programování (IZP)

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

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

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

2 Datové typy v jazyce C

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

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

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

Zpracoval:

Základy programování (IZP)

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

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

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

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

Úvod do programování. Lekce 1

Operační systémy. Cvičení 3: Programování v C pod Unixem

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

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

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

Hotelová škola, Obchodní akademie a Střední průmyslová škola Teplice,Benešovo náměstí 1, příspěvková organizace

Základy programování (IZP)

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

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

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

Standardní algoritmy vyhledávací.

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řetížení operátorů (o)

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

- jak udělat konstantu long int: L long velka = 78L;

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

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

Programovací jazyk C++ Hodina 1

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

Zápis programu v jazyce C#

Programování v jazyce C pro chemiky (C2160) 10. Grafická knihovna g2

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

Více o konstruktorech a destruktorech

Konstruktory a destruktory

Strukturu lze funkci předat: (pole[i])+j. switch(výraz) velikost ukazatele

Zadání: TÉMA: Zápis algoritmu, čtení textového souboru, porovnání řetězců.

Programování v jazyce C pro chemiky (C2160) 12. Specifické problémy při vývoji vědeckého softwaru

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

C2110 Operační systém UNIX a základy programování

Úvod do programování - Java. Cvičení č.4

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

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný

Programování v jazyce C pro chemiky (C2160) 7. Ukazatele, Funkce pro práci s řetězci

Základy PERLu snadno a rychle

Soubor jako posloupnost bytů

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Abstraktní třídy, polymorfní struktury

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: Předmět: ZAP

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

Výčtový typ strana 67

Preprocesor a koncepce (větších) programů. Úvod do programování 2 Tomáš Kühr

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

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

Paralelní architektury se sdílenou pamětí typu NUMA. NUMA architektury

Pokročilé programování v jazyce C pro chemiky (C3220) Knihovna Qt část 2

Mělká a hluboká kopie

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í

Programovací jazyk C++ Cvičení 2

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

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

Jazyk C práce se soubory. Jan Hnilica Počítačové modelování 16

Základy programování (IZP)

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

Transkript:

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

Proudy pro standardní vstup a výstup V jazyce C++ provádíme textový vstup a výstup prostřednictvím tzv. datových proudů Datové proudy jsou ve skutečnosti specializované třídy dostupné ve standardní knihovně jazyka C++, které poskytují metody a operátory pro zápis a čtení dat Pro práci se standardními vstupy a výstupy je třeba v záhlaví zdrojového souboru deklarovat #include <iostream> a using namespace std; Standardní knihovna obsahuje následující třídy pro standardní vstup a výstup: ios - pro vstupní a výstupní operace istream pro vstupní operace ostream pro výstupní operace Ve standardní knihovně jsou definovány následující proměnné: istream cin pro standardní vstup (z klávesnice) ostream cout pro standardní výstup (na obrazovku) ostream cerr pro chybový výstup (na obrazovku) ostream clog - pro chybový výstup po řádcích (na obrazovku) 2

Operátory pro vstup a výstup Pro výstup do proudu používáme operátor <<, pro vstup >> Tyto operátory lze použít pouze pro čtení/zápis proměnných základních datových typů (int, double, char) a typu string #include <iostream> using namespace std; int main() int i = 5; double a = 10; string str; cout << "Hodnota promenne i: " << i << endl; cout << "Hodnota promenne a: " << a << endl; cin >> str; cout << "Retezec je: " << str << endl; return 0; 3

Vstup a výstup objektových proměnných Operátory << a >> nelze použít pro čtení/zápis objektových proměných Pro objektové proměnné musíme číst/zapisovat jednotlivé členy třídy samostatně #include <iostream> using namespace std; // Na zacatku je definovana trida Circle viz. minule cviceni void Circle::readValues() cin >> x >> y >> radius >> color; int main() Circle circ; circ.readvalues(); cout << circ.getcentrex() << circ.getcentrey() << circ.getcolor(); // Nasledujici by nefungovalo: cin >> circ; cout << circ; return 0; 4

Souborový vstup a výstup Pro zápis do souboru a čtení ze souboru používáme následující třídy: fstream - pro vstupní a výstupní souborové operace ifstream pro vstupní souborové operace ofstream pro výstupní souborové operace Tyto třídy jsou odvozeny ze základních tříd pro standardní vstup a výstup ios, istream, ostream Pro práci se souborovými vstupy a výstupy je třeba v záhlaví zdrojového souboru deklarovat #include <fstream> a using namespace std; 5

Zápis do souboru Pro výstup do souboru vytvoříme proměnnou typu ofstream Soubor otevřeme metodou open() které předáme jméno souboru Úspěšnost otevření souboru ověříme pomocí metody fail(), která vrací pravdivou hodnotu pokud bylo otevření souboru neúspěšné Pro zápis dat používáme operátor << Na konci soubor uzavřeme pomocí metody close() #include <fstream> using namespace std; int main() ofstream ofile; // Definujeme promennou proudu ofile.open("test.dat"); // Otevreme soubor if (ofile.fail()) cout << "Nelze otevrit soubor!\n"; return 1; ofile << "Tento text se zapise do souboru" << endl; ofile.close(); return 0; 6

Čtení ze souboru Pro čtení dat ze souboru vytvoříme proměnnou typu ifstream Soubor otevřeme metodou open() které předáme jméno souboru Úspěšnost otevření souboru ověříme pomocí metody fail() Pro čtení dat používáme operátor >> Na konci soubor uzavřeme pomocí metody close() #include <fstream> using namespace std; int main() double a1 = 0.0, a2 = 0.0; ifstream ifile; ifile.open("test.dat"); if (ifile.fail()) cout << "Nelze otevrit soubor!\n"; return 1; ifile >> a1 >> a2; ifile.close(); return 0; 7

Argument metody open() U staršíhu standardu C++98 musí být argument, který předáváme do metody open() typu char*, nelze mu tedy předat přímo proměnnou typu string Z proměnné typu string získáme řetězec char* pomocí metody c_str() string filename = "test.dat"; ofstream ofile; ofile.open(filename.c_str()); // Nejake operace pro zapis do proudu ofile ofile.close(); V novějším standardu C++11 může být argument, který předáváme do metody open() typu string nebo typu char* Chceme-li aby překladač g++ používal novější standard, použijeme při překladu parametr -std=c++11 (u starších verzí je dostupný pouze předběžný standard pomocí parametru -std=c++0x ) 8

Diagnostika I/O chyb Po otevření souboru a také po načtení nebo zápisu znaku potřebujeme zjistit, zdali byla operace úspěšná. K tomu používáme následující metody: fail() - vrací true pokud byla operace neúspěšná good() vrací true pokud byla operace úspěšná, tedy opačnou hodnotu než fail() eof() - vrací pravdivou hodnotu pokud se proud nachází na konci souboru (týká se jen čtení ze souboru) ifstream ifile; ifile.open("test.dat"); if (ifile.fail()) // testujeme uspesnost otevreni souboru cout << "Nelze otevrit soubor!\n"; return 1; double a = 0; ifile >> a; // Nacitani hodnoty do promenne a if (ifile.fail()) // testujeme uspesnost nacteni cout << "Nepodarilo se nacist hodnotu!" << endl; 9

Zrušení chybového stavu proudu Pokud byla předchozí operace neúspěšná (tj. fail() vrátí pravdivou hodnotu) je další načítání/zápis z/do proudu pozastaveno, tj. selžou všechny operace které se o to pokusí Tento chybový stav musíme odstranit voláním metody clear(), teprve potom můžeme provádět další operace čtení a zápisu double a; string s; ifstream ifile; ifile.open("test.dat"); // Nasledujici pokus o nacteni cisla bude neuspesny (napr. protoze // ve vstupnim souboru se nachazeji neciselne znaky) ifile >> a; if (ifile.fail()) cout << "Chyba pri cteni cisla." << endl; // Volanim clear() zrusime chybovy stav proudu ifile.clear(); // Nyni nacteme text. Pokud bychom predtim nezavolali clear() // zadny text by se nenacetl protoze proud by byl v chybovem stavu. ifile >> s; cout << "Nacteny text: " << s << endl; 10

Proudy pro vstup a výstup z/do řetězce Data lze také načítat nebo zapisovat do řetězce, tj. proměnné typu string. K tomu používáme následující třídy: stringstream - pro načítání/zápis z/do řetězce istringstream pro načítání z řetězce ostringstream pro zápis do řetězce Tyto třídy jsou odvozeny ze základních tříd pro standardní vstup a výstup ios, istream, ostream Pro práci se souborovými vstupy a výstupy je třeba v záhlaví zdrojového souboru deklarovat #include <sstream> a using namespace std; 11

Proudy pro vstup a výstup z/do řetězce Pro načítání dat z řetězce vytvoříme proměnnou typu istringstream, pro zápis ostringstream, a při inicializaci jim předáme jméno řetězcové proměnné Operátor >> používáme pro čtení, operátor << pro zápis K diagnostice úspěšnosti načítání opět používáme funkci fail() #include <sstream> using namespace std; int main() double a1 = 0.0, a2 = 0.0, a3 = 0.0; string s = "3.24 1.2 5.7"; istringstream sstream(s); sstream >> a1 >> a2 >> a3; if (sstream.fail()) cout << "Chyba pri nacitani z retezcoveho proudu" << endl; return 0; 12

Proudy pro vstup a výstup z/do řetězce Pokud chceme načítat z jiného řetězce, můžeme použít stejný proud do kterého nastavíme nový řetězec pro načítání pomocí metody str() Poté zavoláme metodu clear() abychom zrušili případnou chybu z předchozího načítání #include <iostream> #include <sstream> using namespace std; int main() double a1 = 0.0, a2 = 0.0, a3 = 0.0; double b1 = 0.0, b2 = 0.0, b3 = 0.0; string s1 = "3.24 1.2 5.7"; string s2 = "2.0 4.5 6.0"; istringstream sstream(s1); sstream >> a1 >> a2 >> a3; // Ted nacitame z retezce s1 sstream.str(s2); // Do proudu nastavime retezec s2 sstream.clear(); // Zrusime pripadny chybovy stav sstream >> b1 >> b2 >> b3; // Ted nacitame z retezce s2 return 0; 13

Načítání souboru po řádcích Pro načtení celého řádku z proudu používáme funkci getline(), která z proudu načte jeden řádek a přiřadí ho do řetězcové proměnné typu string předané jako druhý argument Tuto řetězcovou proměnnou nastavíme do příslušného řetězcového proudu metodou set() a načítáme string filename = "soubor.dat"; double a1 = 0.0, a2 = 0.0; string s; istringstream sstream; ifstream ifile; ifile.open(filename.c_str()); if (ifile.fail()) cout << "Nelze otevrit soubor: " << filename << endl; return; while (!ifile.eof()) getline(ifile, s); // Nacte jeden radek z proudu ifile do retezce s sstream.str(s); // Proud sstream bude nacitat z retezce s sstream.clear(); // Zrusime predchozi chybovy stav sstream >> a1 >> a2; if (ifile.fail() &&!ifile.eof()) cout << "Chyba pri nacitani souboru!" << endl; break; ifile.close(); 14

Datový proud jako argument funkce Pokud proudovou proměnnou předáváme jako argument funkce, předáváme ho tzv. referencí, což vyjádříme přidáním & před jméno předávaného parametru // Proud predavame do funkce formou reference, coz // specifikujeme pridanim & pred jmeno parametru void read(istringstream &istream) double a1 = 0.0, a2 = 0.0; istream >> a1 >> a2; int main() string s = "2.13 5.67"; istringstream sstream; sstream.str(s); sstream.clear(); read(sstream); // Funkci read() predavame proud sstream return 0; 15

Dodržujte následující pravidla Pro práci se souborovými proudy nezapomeňte vložit hlavičkový soubor fstream a pro práci s řetězcovými proudy soubor sstream Pokud předáváte proměnné proudu (streams) do metod, předávejte je jako referenci (tj. použijte & před jménem parametru) Nepoužívejte v programu globální proměnné pokud to není nezbytně nutné, upřednostněte lokální proměnné a ty předávejte do funkcí/metod. Proměnné, které souvisí s funkcí objektů umístěte do třídy. 16

Cvičení 1. Vytvořte program vycházející z programu v úloze 2 z minulého cvičení. Program uzpůsobte tak, že místo interaktivního vstupu bude údaje o zobrazovaném objektu načítat ze souboru. V souboru bude uveden typ grafiky která se bude kreslit, souřadnice x, y a případně další hodnoty (poloměr pro kružnici, šířka a výška pro obdélník, poloměr a číslo barvy kružnice, číslo barvy výplně pro vyplněnou kružnici). Tyto hodnoty budou odděleny mezerami. V souboru bude uveden pouze jeden řádek s jedním objektem (například: circle 150 150 60 3). Jméno vstupního souboru bude programu předáno jako parametr na příkazovém řádku. Otestujte se soubory circle.dat, rectangle.dat, filled_circle.dat v adresáři /home/martinp/c3220/data/ 2 body 2. /home/martinp/c3220/data/graphic1.dat (měl by se vykreslit stejný obrazec jako je na obrázku). 3 body 17

Úloha 1 nápověda Do tříd Graphic, Circle, Rectangle a FilledCircle implementujte metodu void readfile(ifstream &istream), která bude vypadat podobně jako metoda readvalues() ale bude načítat dta ze souborového proudu, který jí bude předán jako argument. Načítání suboru implementujte ve funkci main() jak je uvedeno v příkladu v sekci Načítání ze souboru. Ze souboru načtěte řetězec do řetězcové proměnné a podle obsahu této proměnné ( circle, rectangle, filled_circle ) vytvořte objektovou proměnnou příslušného typu a zavolejte její metodu readfile() a následně volejte metodu printvalues() a pak draw() Argumenty předané programu na příkazovém řádku získáme stejně jako při programováni v jazyce C, tj. funkce main() bude přijímat dva parametry main(int argc, char *argv[]), kde argc obsahuje počet předaných parametrů zvětšený o 1, pole argv[] obsahuje seznam parametrů (argv[0] obsahuje název suboru s programem, teprve argv[1] obsahuje první předaný parametr.) 18

Úloha 2 nápověda Metodu readfile() ve všech objektech modifikujte tak, že bude přijímat proud istringstream namísto ifstream, tj: void readfile(istringstream &istream). Na začátek souboru nezapomeňte vložit hlavičkový soubor sstream. Ve funkci main() definujte proměnnou pro pole kružnic Circle circles[max_graphic]; (MAX_GRAPHIC bude definováno na začátku souboru jako symbolická konstanta #define MAX_GRAPHIC 100). Podobně definujte pole rectangles a filledcircles. Také definujte celočíselné proměnné, které budou obsahovat počet načtených položek (circlescount, rectanglescount, filledcirclescount). Vstupní soubor načítejte v cyklu po řádcích, jak je uvedeno v příkladu v sekci Načítání souboru po řádcích. Další postup je podobný jako v předchozí úloze, tj. načtete první slovo a podle toho rozhodnete, který objekt se bude načítat. Po načtení objektu nezapomeňte vždy zvýšit o 1 hodnotu proměnné obsahující počet načtených položek (circlescount,...). Pokud je na začátku řádku uvedeno slovo window načtou se rozměry okna (do lokálních proměnných). Po načtení souboru (a jeho uzavření) dojde k vykreslení všech objektů. Nejdříve se otevře okno (jeho šířka a výška jsou dány hodnotami ve vstupním souboru na prvním řádku) a potom se v cyklu vykreslí všechny načtené kružnice (tj. zavolá se circles[i].draw(dev);). Potom se totéž provede pro čtverce a vyplněné kružnice. Nakonec program čeká na stisknutí Enter a pak okno zavře. Program vylepšete použitím třídy Drawing, která bude mít podobnou roli jako v úloze3 z předchozího cvičení, konkrétně bude obsahovat pole objektů circles[], filledcircles[] a rectangles[] a proměnné pro šířku a výšku okna. Dále bude obsahovat metodu pro načtení dat ze souboru readfile(string filename), která přijímá jméno souboru jako parametr a metodu draw(), která otevře okno a vykreslí do něj včechny grafické objekty. Ve funkci main() vytvořte objekt typu Drawing a zavolejte jeho metodu readfile() a potom draw(). 19