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

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

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

Vstupy a výstupy v jazyce C++

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

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

Vstupní a vstupní proudy v C++

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

Úvod do programování. Lekce 1

VISUAL BASIC. Práce se soubory

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

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

Vstup a výstup datové proudy v C

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

Datové typy pro reálná čísla

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

Úvod do programování. Lekce 3

Datové typy pro reálná čísla

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

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

Zápis programu v jazyce C#

vstup a výstupv jazyce C

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

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

Programovací jazyk C++ Cvičení 2

Ošetřování chyb v programech

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

NPRG030 Programování I, 2010/11

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

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

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

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

katedra informatiky FEI VB-TU Ostrava 10. jna 2005 etr aloun (katedra informatiky FEI VB-TU Ostrava) Dal vrazy 10. jna / 25

Zpracoval:

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

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

Algoritmizace a programování

vstup a výstupy jazyce C

NPRG030 Programování I, 2016/17 1 / :58:13

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

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

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

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

Standardní vstup a výstup

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

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

Formátová specifikace má tvar (některé sekce nemají smysl pro načítání) %

Vector datový kontejner v C++.

Programování v C++ První kroky

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

Jazyk C# a platforma.net

10 Práce s řetězci - pokračování

Lekce 9 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.

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

Programování v C++ Objektové programování

PB161 Programování v jazyku C++

Formátové specifikace formátovací řetězce

Příklad: Součet náhodných čísel ve vektoru s počtem prvků, které zadá uživatel, pomocí sum() a pomocí cyklu for. Ověříme, že příliš výpisů na

Úvod do programování 8. hodina

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

Informatika Datové formáty

Standardní algoritmy vyhledávací.

- tzv. standardní vstupní a výstupní proud (input / output stream)

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

Aplikovaná informatika. Podklady předmětu Aplikovaná informatika pro akademický rok 2006/2007 Radim Farana. Obsah. Obsah předmětu

2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.

Základy programování (IZP)

Odvozené a strukturované typy dat

Funkční objekty v C++.

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

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

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

Bitové operátory a bitová pole. Úvod do programování 2 Tomáš Kühr

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

Jazyk C# (seminář 5)

Programovací jazyk Pascal

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

1. Programování pro DOS a některé zastaralé součásti C++

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

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

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

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

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

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

Ahoj mami. Uložení dat v počítači. Příklady kódování dat. IAJCE Přednáška č. 4

Šablony, kontejnery a iterátory

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

Práce s binárními soubory. Základy programování 2 Tomáš Kühr

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

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

Opakování programování

V dalších letech se pak začaly objevovat první normy pro jazyk C++ (ISO/IEC 14882:1998; ISO/IEC 9899:1999; ISO/IEC 14882:2003; ISO/IEC 14882:2011).

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

Basic256 - úvod do programování Příklady. ing. petr polách

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

6. PRÁCE S DATOVÝMI PROUDY

Paměť počítače. alg2 1

Transkript:

Datové proudy objektový vstup a výstup v C++ Petr Šaloun 10. listopadu 2014 PJCPP Objektový vstup/výstup 10-1

Datové proudy objektový vstup a výstup v C++ Základní pojmy Znakje elementární textová informace, je umístěn v ASCII tabulce číselný kód 8 bitový, datové typy znak char, řetězec string: tisknutelný znak 32 až 127, řídicí escape sekvence, znaky národních abeced. 16bitový kód UNICODE, datové typy znak wchar t, řetězec wstring. Slovo posloupnost znaku. Slova jsou navzájem oddělena interpunkčními znaménky a odsazovači. Řádek textu posloupnost slov ukončená symbolem (symboly) přechodu na nový řádek. Délka řádku? Třída string vytvoří potřebný prostor. Na úrovni OS možnost vstup a výstup přesměrovat programy, které čtou ze standardního vstupu a zapisují do standardního výstupu, se nazývají filtry. PJCPP Objektový vstup/výstup 10-2

Textový I/O: Pro ukončení vstupu z klávesnice, Win32 ctrl-z, unix ctrl-d. Standardní objektový vstup a výstup používá vyrovnávací pamět jeden textový řádek. Program mu že vstup číst až v okamžiku, kdy ukončíme řádek klávesou enter. Hlavička iostream. PJCPP Objektový vstup/výstup 10-3

Třídy pro vstup a výstup datový proud data stream textový, binární hlavička iostream, třída ios Třídy pro vstup a výstup jsou založeny na šablonách stejné rozhraní pro vstup a výstup textu, bez ohledu na jeho kódování. pomu cka: třídy a objekty vstup z proudu i, jako input; výstup o, od output; soubory f, jako file. Typ char, šablony: basic + název třídy: třída popis datového proudu streambuf s vyrovnávací pamětí ios vstupně výstupní istream vstupní ostream výstupní fstream souborový ifstream vstupní souborový ofstream výstupní souborový Třídy pro standardní i souborové datové proudy. PJCPP Objektový vstup/výstup 10-4

Přetížené operátory pro vstup/výstup: «pro výstup do proudu, (put to, insertion),» pro vstup z proudu (get from, extraction). Objekty standardního textového vstupu a výstupu Standardní datové proudy C++ pro objektový I/O. datový proud popis std. zařízení cin std. vstup klávesnice cout std. výstup obrazovka cerr std. chybový výstup obrazovka clog std. chybový výstup po řádcích obrazovka PJCPP Objektový vstup/výstup 10-5

Výstup a jeho formátování operátor «levý operand objekt typu ostream, pravý operand libovolný typ (pro nějž je výstup defi nován). cout < < Ahoj! < < endl ; i n t i = 5 ; double d = 1 2 3. 4 5 6 ; cout < < i = < < i < < \ td = << d << endl ; PJCPP Objektový vstup/výstup 10-6

Formátovací příznaky pro textové proudy příznak popis skipws přeskoč bílé znaky na vstupu left výstup zarovnej vlevo right výstup zarovnej vpravo internal vata po znaménku či indikátoru báze dec proved desítkový převod oct proved osmičkový převod hex proved šestnáctkový převod showbase ukaž bázi při výstupu showpoint vynut desetinnou tečku (rac. výstup) uppercase použij velká písmena při hex. výstupu showpos zobrazuj kladná celá čísla s + scientifi použij např. 1.2345E2 pro rac. výstup fixe použij např. 123.45 pro rac. výstup unitbuf vyprázdni všechny vyr. paměti po každém přidání stdio po přidání vyprázdni stdout a stderr boolalpha umožní řetězec true či false při I/O adjustfiel společné pro internal, left right basefiel dec, oct, hex floatfie fixe a scientifi PJCPP Objektový vstup/výstup 10-7

Formátování výstupu pomocí stavových příznaků formátovací stavové příznaky definov ny ve třídě ios a v jejím jmenném prostoru třídy, proto např. ios::hex. Výčtový datový typ pro konstanty všech formátovacích stavových příznaku fmtflags je definov n ve třídě ios. lze spojovat bitovým nebo prostě sčítat hodnoty jsou mocninami dvou. metody setf() pro nastavení příznaku, či unsetf() pro jejich zrušení. Objekt cout má přístup i k jiným metodám, než jen nastavení a zjištění stavu formátovacích příznaku. Jsou jimi zvláště metody put() a write(). I tyto metody umožňují výstup do textového proudu, který ovšem, na rozdíl od přetíženého operátoru «, není hodnotou formátovacích příznaku ovlivněn. PJCPP Objektový vstup/výstup 10-8

/ soubor os t f l g. cpp / # i n c l u d e < iostream> using namespace std ; void main ( ) { cout << 123 << \ t < < 123.456e15 < < \ t << 0xfe < < \ t < < t r u e << endl ; cout. s e t f ( i o s : : hex i o s : : showbase i o s : : boolalpha ) ; cout. unsetf ( i o s : : dec ) ; / / pro nektere prekladace nutne cout << 123 << \ t < < 123.456e15 < < \ t << 0xfe < < \ t < < t r u e << endl ; } / / void main ( ) 123 1.23456e+017 254 1 0x7b 1.23456e+017 0xfe true PJCPP Objektový vstup/výstup 10-9

Formátování výstupu pomocí manipulátorů manipulátory: speciální operátory podobné funkcím; používají jako svu j argument odkaz na proud, který rovněž vracejí; mohou být součástí příkazu výstupu. Manipulátory textových proudu 1 manipulátor význam pro boolalpha log. hodnoty textově I/O dec desítková soustava I/O endl odřádkuje O ends ukončí řet. a vyprázdní vyrov. pamět O fixe nastaví příznak fixe O flus vyprázdní vyr. pamět O hex šestnáctková soustava I/O internal nastaví příznak O left desítková soustava I/O noboolalpha zruší příznak I/O noshowbase zruší příznak O noshowpoint zruší příznak O noshowpos zruší příznak O noskipws zruší příznak I nounitbuf zruší příznak O nouppercase zruší příznak O oct osmičková soustava I/O PJCPP Objektový vstup/výstup 10-10

Manipulátory textových proudu 2 manipulátor význam pro resetiosflags(fmtfla f) zruší určené příznaky I/O right nastaví příznak O scientifi nastaví příznak O setbase(int base) základ (0, 8, 10, 16) I/O setfill(in ch) nastaví znak pro výplň O setiosflags(fmtfla f) nastaví určené příznaky I/O setprecision(int p) přesnost u rac. čísel O setw(int w) šířka pole O showbase nastaví příznak O showpoint nastaví příznak O showpos nastaví příznak O skipws nastaví příznak I unitbuf nastaví příznak O uppercase nastaví příznak uppercase O ws přeskočí uvozující bílé znaky I PJCPP Objektový vstup/výstup 10-11

Pro vstup jsou definov ny další metody: například get() a read(). Poslední načtený bajt je možno vrátit zpět pomocí metody putback(). Podívat se na příští vstupující znak bez jeho přečtení umožňuje metoda peek(). Poznamenejme ještě, že textové proudy mohou pro vstup i výstup využívat řádkovou vyrovnávací pamět dokud neodřádkujeme, nezobrazí se z rozpracovaného výstupu do řádku nic. PJCPP Objektový vstup/výstup 10-17

/ / soubor s t r i misc. cpp # i n c l u d e < iostream> # i n c l u d e <iomanip> using namespace std ; int main ( ) { bool b ; cout < < zadej true nebo f a l s e < < endl ; c i n >> boolalpha >> b ; cout << b < < \ t < < boolalpha << b << endl ; i n t d, o ; cout < < zadej dve cela osmickova c i s l a << endl ; c i n >> oct >> d >> o ; char s [ 1 0 ] ; cout < < zadej retezec < < endl ; c i n >> setw ( s i z e o f ( s )) > > s ; / / s nepretece cout << endl < < d = < < d < < \ to = < < o << endl < < s = < < s << endl ; } / / int main ( ) PJCPP Objektový vstup/výstup 10-18

zadej true nebo false false 0 false zadej dve cela osmickova cisla 0123 0765 zadej retezec Ahoj,babi! d =83 o =501 s = Ahoj,babi PJCPP Objektový vstup/výstup 10-18

Textový vstup a výstup v paměti sstream hlavička pro práci s pamět ovým textovým vstupem a výstupem, istringstream, ostringstream třídy pro textový pamět ový vstup a výstup. PJCPP Objektový vstup/výstup 10-19

/ / soubor iostrm mem. cpp # i n c l u d e < iostream> # i n c l u d e <sstream> # i n c l u d e < s t r i n g > using namespace std ; int main ( ) { s t r i n g vstup = 2 2 7 Ahoj!, vystup, retezec ; i s t r i n g s t r e a m zpameti ( vstup ) ; i n t a, b ; zpameti >> a >> b >> retezec ; ostringstream dopameti ( vystup ) ; dopameti << a < < / < < b < < = << (double ) a / b << endl ; dopameti << retezec << endl ; cout << dopameti. s t r ( ) ; } / / int main ( ) 22 / 7 = 3.14286 Ahoj! PJCPP Objektový vstup/výstup 10-20

Soubory Soubor je posloupnost znaku (bajtu ) ukončená nějakou speciální kombinací, která již k obsahu souboru nepatří konec souboru, symbolicky EOF. Textový soubor obsahuje řádky textu. Binární soubor obsahuje hodnoty ve stejném tvaru, v jakém jsou uloženy v paměti počítače. vnější jméno souboru jméno souboru na úrovni operačního systému; vnitřní jméno souboru identifikac souboru v rámci programu v jazyce C++, nejčastěji jde o jméno objektu, jehož prostřednictvím se souborem pracujeme. Každý proud lze otevřít a uzavřít. Teprve po otevření mu žeme s proudem pracovat. Při otevření proudu provádíme spojení mezi vnitřním a vnějším jménem souboru. Při otevření určujeme režim našeho přístupu k datu m v proudu. Uzavřením proudu umožňujeme OS aktualizovat adresářové informace podle aktuálního stavu souboru, který byl s proudem spojen. PJCPP Objektový vstup/výstup 10-21

Objektový textový vstup a výstup z/do souborů shodný se standardním textovým vstupem a výstupem (do otevřených proudu ): double f ; vstupni proud >> f ; vystupni proud < < bylo nacteno : < < f ; liší se hlavička: # i n c l u d e < fstream> a označení tříd ofstream pro výstup, ifstream pro vstup. PJCPP Objektový vstup/výstup 10-22

otevření souborového datového proudu konstruktor: i f s t r e a m vstupni proud ( soubor. i n ) ; ofstream vystupni proud ( soubor. out ) ; nebo open(), zavření close(). neúspěšné otevření proudu NULL: i f ( vstupni proud = = 0 ) c e r r << chyba p r i o t e v r e n i vstupniho souboru <soubor. in > ; else... PJCPP Objektový vstup/výstup 10-23

Režimy práce se souborem (ios::): režim popis činnosti app připojuje data, vždy se zapisuje na konec souboru ate otevře a nastaví se na konec souboru in při otevření nastaví režim čtení (implicitní pro ifstream) out při otevření nastaví režim zápis (implicitní pro ofstream) binary otevře soubor v binárním režimu trunc zruší obsah souboru, pokud existuje Při práci s binárním proudem je nezbytný blokový přenos dat. náhodný přístup položky binárního souboru mají známou velikost lze vypočíst jejich polohu a přečíst, nebo zapsat na určenou pozici. put(), get() pracují neformátovaně s jedním bajtem (znakem), read(), write(): argumenty adresa a počet bajtu. Metoda eof() vrací true při dosažení konce souboru. PJCPP Objektový vstup/výstup 10-24

/ / soubor s t r o f b1. cpp / / v y t v o r i soubor odmoc. dta # i n c l u d e < fstream> # i n c l u d e <cmath> using namespace std ; const char jmeno = odmoc. dta ; int main ( ) { ofstream ofs ( jmeno, i o s : : out i o s : : binary ) ; i f ( ofs! = 0 ) { double f ; f o r ( i n t i = 0 ; i < 100; i ++) { f = s q r t ( i + 1 ) ; ofs. w r i t e ( ( const char ) & f, s i z e o f ( f ) ) ; } / / f o r ( ; ; ) ofs. close ( ) ; } / / i f ( ofs! = 0 ) } / / int main ( ) PJCPP Objektový vstup/výstup 10-25

Sekvenční čtení z odmoc.dta +1.000 +1.414 +1.732 +2.000 +2.236 +2.449 +2.6 +3.317 +3.464 +3.606 +3.742 +3.873 +4.000 +4.1 +4.583 +4.690 +4.796 +4.899 +5.000 +5.099 +5.1 +5.568 +5.657 +5.745 +5.831 +5.916 +6.000 +6.0 +6.403 +6.481 +6.557 +6.633 +6.708 +6.782 +6.8 +7.141 +7.211 +7.280 +7.348 +7.416 +7.483 +7.5 +7.810 +7.874 +7.937 +8.000 +8.062 +8.124 +8.1 +8.426 +8.485 +8.544 +8.602 +8.660 +8.718 +8.7 +9.000 +9.055 +9.110 +9.165 +9.220 +9.274 +9.3 +9.539 +9.592 +9.644 +9.695 +9.747 +9.798 +9.8 PJCPP Objektový vstup/výstup 10-26

/ / soubor s t r i f bs. cpp # i n c l u d e < iostream> # i n c l u d e < fstream> # i n c l u d e <iomanip> using namespace std ; const char jmeno = odmoc. dta ; int main ( ) { i f s t r e a m i f s ( jmeno, i o s : : i n i o s : : binary ) ; i f ( i f s! = 0 ) { double f ; cout << setw (7) < < s e t p r e c i s i o n ( 4 ) <<s e t i o s f l a g s ( i o s : : showpoint i o s : : showpos ) ; while ( t r u e ) { i f ( i f s. eof ( ) ) { / / t e s t konce souboru break ; } / / i f ( i f s. eof ( ) ) i f s. read ( ( char ) & f, s i z e o f ( f ) ) ; cout << f < < \ t ; } / / while ( t r u e ) i f s. close ( ) ; } / / i f ( i f s! = 0 ) } / / int main ( ) PJCPP Objektový vstup/výstup 10-27

Souborový datový proud otevřený v binárním režimu mu žeme číst sekvenčně i náhodně. Stejné je to se zápisem. Pro kombinaci čtení a zápisu nad stejným souborem dva ukazatele: get ukazatel ukazuje na místo v souboru, odkud proběhne příští čtení; put ukazatel na místo, na které proběhne příští zápis. Metody rozhraní zpřístupňující popsaná ukazatele programátorovi se jmenují: tellg(), tellp() vrací hodnoty ukazatelu, seekg(), seekp() je nastavují. pos type typ pro čtení pozice v souboru. Nastavení pozice: počet bajtu a vztažná pozice. PJCPP Objektový vstup/výstup 10-27

Konstanty pro určení vztažné pozice v souboru, ios:: identifik tor význam beg posun vu či aktuální pozici cur posun vzhledem počátku end posun vzhledem ke konci i f s. seekg ( ( i 1 ) s i z e o f ( f ), i o s : : beg ) ; PJCPP Objektový vstup/výstup 10-28

/ / soubor s t r i f bn. cpp # i n c l u d e < iostream> # i n c l u d e < fstream> # i n c l u d e <iomanip> using namespace std ; const char jmeno = odmoc. dta ; int main ( ) { i f s t r e a m i f s ( jmeno, i o s : : i n i o s : : binary ) ; i f ( i f s! = 0 ) { double f ; i n t i ; cout << setw (7) < < s e t p r e c i s i o n ( 4 ) << s e t i o s f l a g s ( i o s : : showpoint i o s : : showpos ) ; cout << Zadej cele c i s l o v rozsahu <1, 100 >: ; c i n >> i ; PJCPP Objektový vstup/výstup 10-29

while ( ( i > 0 ) & & ( i < 1 0 1 ) ) { i f s. seekg ( ( i 1 ) s i z e o f ( f ), i o s : : beg ) ; i f s. read ( ( char ) & f, s i z e o f ( f ) ) ; cout < < druha odmocnina z < < i << \ t j e < < f << endl ; cout << Zadej cele c i s l o v rozsahu <1, 100 >: ; c i n >> i ; } / / while ( ) cout << endl < < Konec. < < endl ; i f s. close ( ) ; } / / i f ( i f s! = 0 ) } / / int main ( ) Zadej cele cislo v rozsahu <1, 100>:2 druha odmocnina z +2 je +1.414 Zadej cele cislo v rozsahu <1, 100>:4 druha odmocnina z +4 je +2.000 Zadej cele cislo v rozsahu <1, 100>:29 druha odmocnina z +29 je +5.385 Zadej cele cislo v rozsahu <1, 100>:0 Konec. PJCPP Objektový vstup/výstup 10-29