Vstup a výstup datové proudy v C



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

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

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

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

vstup a výstupv jazyce C

Standardní vstup a výstup

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

vstup a výstupy jazyce C

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

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

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

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

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

VISUAL BASIC. Práce se soubory

Práce s binárními soubory. Základy 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:

Základy programování (IZP)

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

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.

Úvod do programování. Lekce 1

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

Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr)

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

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

Algoritmizace a programování

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

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

Odvozené a strukturované typy dat

Základy programování (IZP)

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

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

Proměnná a její uložení v paměti

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

Základní datové typy, proměnné - deklarujeme předem - C je case sensitive rozlišuje malá a velká písmena v názvech proměnných a funkcí

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

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

vstup a výstupy jazyce C

Úvod do programovacích jazyků (Java)

BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky

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

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

Základy jazyka C. Základy programování 1 Tomáš Kühr

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

NPRG030 Programování I, 2010/11

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

Ošetřování chyb v programech

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

11b Další příklady operací vstupu a výstupu (úvod viz 10)

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

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

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

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

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

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky

Algoritmizace a programování. Terminálový vstup a výstup

Algoritmizace a programování

Struktura programu v době běhu

BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky

Zápis programu v jazyce C#

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

Systém souborů (file system, FS)

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

Struktury a dynamická paměť

Práce s řetězci. IUJCE Přednáška č. 10. string.h. vrací: délku řetězce str (bez '\0')

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

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

Opakování programování

Stromy, soubory. BI-PA1 Programování a Algoritmizace 1. Ladislav Vagner, Josef Vogel

PB071 Programování v jazyce C

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

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

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 Třídy, objekty, metody, předávání argumentů metod

BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky

Úvod do programovacích jazyků (Java)

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

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

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ý

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

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

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

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

Knihovny funkcí. Chyby v CRT. IUJCE Přednáška č. 9

Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr)

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

Rozsáhlé programy = projekty

Třídy a struktury v C++

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Jazyk C Program v jazyku C má následující strukturu: konstanty nebo proměnné musí Jednoduché datové typy: Strukturované datové typy Výrazy operátory

7. Datové typy v Javě

Soubory. Hung Hoang Dieu. Department of Mathematics Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague 1 / 7

IUJCE 07/08 Přednáška č. 6

printf - formatovany vystup

Algoritmy v jazyku C a C++

Jak v Javě primitivní datové typy a jejich reprezentace. BD6B36PJV 002 Fakulta elektrotechnická České vysoké učení technické

Strukturované typy a ukazatele. Úvod do programování 1 Tomáš Kühr

Programovací jazyk C(++) C++ area->vm_mm->locked_vm -= len >> PAGE_SHIFT;

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

Transkript:

Vstup a výstup datové proudy v C Petr Šaloun katedra informatiky FEI VŠB-TU Ostrava 24. října 2011 Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 1 / 37

Přehled, rozdělení I/O, základní pojmy Vstupně výstupní zařízení (I/O): znaková: vstupní klávesnice, výstupní monitor, tiskárna. bloková: pevný disk, flash disk, SD, microsd... Z klávesnice čteme sekvenčně znak po znaku (sekvenční přístup), u binárního diskového souboru můžeme libovolně přistupovat ke zvolené části dat náhodný přístup. Pojmy: Řádek textu je posloupnost znaků ukončená symbolem (symboly) přechodu na nový řádek. Soubor je posloupnost znaků (bajtů) ukončená nějakou speciální kombinací, která do obsahu souboru nepatří konec souboru symbolicky EOF. Textový soubor obsahuje řádky textu. Binární soubor obsahuje hodnoty v témže tvaru, v jakém jsou uloženy v paměti počítače. OS nezná typ souboru. Přípony jmen souborů jsou většinou pouze doporučeními. Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 2 / 37

Standardní vstup a výstup Každý spuštěný program v jazyce C má otevřen stdin standardní vstup, stdout standardní výstup, a stderr standardní chybový výstup. Jsou napojeny na klávesnici a terminál. Na úrovni operačního systému lze vstup a výstup přesměrovat: app.exe < in. txt > out.txt obĺıbené pro tvorbu a ladění funkčního jádra programu, který zatím nemá obsažen styk s uživatelem. Vstupní data uložená z připraveného testovacího souboru, a výsledek přesměrováváme do jiného výstupního souboru. Filtry = jednoduché programy, čtou ze standardního vstupu a zapisují do standardního výstupu; užitečné filtry: grep, more, find. Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 3 / 37

Poznámky ke standardnímu I/O Pro ukončení vstupu z klávesnice použijeme v MS DOSu a MS Windows kombinaci ctrl z, v unixu ctrl d. Standardní vstup a výstup používá vyrovnávací pamět obsahující jeden textový řádek. Při volání funkcí standardního vstupu či standardního výstupu musíme použít hlavičkový soubor stdio. h. Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 4 / 37

Standardní vstup a výstup znaků Základní primitiva jsou zdánlivě funkce getchar() a putchar(), ve skutečnosti makra, volají getc( stdin ) a putc(c, stdout). int getchar(void); přečte ze standardního vstupu jeden znak, který vrátí jako svou návratovou hodnotu. V případě chyby vrátí hodnotu EOF. int putchar(int c); má zcela opačnou úlohu. Znak, který je jejím argumentem, zapíše na standardní výstup. Zapsaná hodnota je současně návratovou hodnotou; nastane li chyba, vrací EOF. Vždy čteme/zapisujeme int, nikoliv char. Textový soubor obsahuje znaky, jeho konec, hodnota EOF do souboru nepatří, hodnota musí být odlišná od ostatních znaků, proto je typu int. Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 5 / 37

Standardní vstup a výstup znaků / cpy. c k o p i r u j e znak ze vstupu na v y s t u p / #i n c l u d e <s t d i o. h> i n t main ( void ) { i n t c ; while ( ( c = g e t c h a r ( ) )!= EOF) p u t c h a r ( c ) ; return 0 ; } Pozn. Nesmíme zapomenout přesměrovat vstup a výstup. Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 6 / 37

Standardní vstup a výstup řetězců jednoduchá nadstavba nad čtením znaků. char g e t s ( char s ) ; i n t puts ( const char s ) ; gets() načte do znakového pole vstupní řetězec až do konce řádku, symbol \n není do znakového pole zapsán. Ukazatel na pole (načtený řetězec) je návratovou hodnotou. Chybu signalizuje návrat NULL. puts() zapíše řetězec na výstup a přidá přechod na nový řádek \n. Chybu představuje návratová hodnota EOF, jinak vrací kladné celé číslo. Pozor, gets() nemá informaci o délce oblasti vymezené pro čtený řetězec! Řádek textu je posloupnost znaků ukončená symbolem přechodu na nový řádek \n. Textový soubor představuje posloupnost řádků textu, je ukončený symbolem EOF. Využití kopírování souboru po řádcích následující příklad. Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 7 / 37

Kopírování vstupu na výstup po řádcích gets.c / / / GETS. C / / GET S t r i n g f u n c t i o n / / / #i n c l u d e <s t d i o. h> #define MAX STR 512 i n t main ( void ) { char s [MAX STR ] ; while ( g e t s ( s )!= NULL) puts ( s ) ; return 0 ; } Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 8 / 37

Formátovaný standardní výstup funkce printf() i n t p r i n t f ( const char format [, argument,... ] ) ; format formátovací řetězec, tj. popis formátu pro každý argument, nebo text, který bude zapsán do výstupu. Popis formátu začíná znakem %, výstupní znak % musíme zdvojit: %%. Návratová hodnota počet položek znaků zapsaných do výstupu, nebo EOF v případě chyby. Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 9 / 37

Určení formátu ve funkci printf() % [ f l a g s ] [ width ] [. p r e c ] [ h l L ] t y p e c h a r položka význam flags zarovnání výstupu, zobrazení znaménka a desetinných míst u čí nuly, prefix pro osmičkový a šestnáctkový výstup; width minimální počet znaků na výstupu, mohou být uvedeny meze nulami;. prec maximální počet znaků na výstupu, pro celá čísla minimum zo znaků, pro racionální počet míst za desetinnou tečkou; l L l indikuje dlouhé celé číslo, L long double; type char povinný znak, určuje datový typ konverze. Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 10 / 37

Datový typ konverze type char symbol význam d, i desítkové celé číslo se znaménkem; u desítkové celé číslo se bez znaménka; o osmičkové celé číslo; x, X šestnáctkové celé číslo, číslice ABCDEF malé (x) nebo velké (X); f racionální číslo ( float, double) bez exponentu, implicitně šest des e, E racionální číslo ( float, double) v desetinném zápisu s exponent jedna pozice před desetinnou tečkou, šest za ní. Exponent uvozuje E. g, G racionální číslo ( float, double) v desetinném zápisu s exponentem (podle absolutní hodnoty čísla). Nemusí obsahovat desetinnou tečk setinnou část). Pokud je exponent menší, než 4, nebo větší, než p číslic, je použit. c znak; s řetězec. Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 11 / 37

Příznak flag ve funkci printf () příznak význam výsledek je zarovnán zleva; + u čísla bude vždy zobrazeno znaménko (i u kladného); mezera pro kladná čísla vynechá prostor pro znaménko; # pro formáty o, x, X výstup jako konstanty jazyka C, pro formáty e, E, f, g, G vždy zobrazí desetinnou tečku, pro g, G ponechá nevýznamné nuly, pro c, d, i, s, u nemá význam. Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 12 / 37

Šířka width ve funkci printf () šířka n 0n význam je vytištěno nejméně n znaků zarovnaných zleva či zprava, viz příznak, doplněno mezerami; jako předchozí, doplněno zleva nulami; jako šířka pole bude použit následující parametr funkce printf (). Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 13 / 37

Přesnost. prec ve funkci printf () přesnost význam.0 pro e, E, f nezobrazí desetinnou tečku, pro d, i, o, u, x nastaví standardní hodnoty;. n pro d, i, o, u, x minimální počet číslic, pro e, E, f počet desetinných číslic, pro g, G počet platných míst, pro s maximální počet znaků; jako přesnost bude použit následující parametr funkce printf (). Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 14 / 37

Formátovaný standardní vstup funkce scanf() i n t s c a n f ( const char format [, a d d r e s s,... ] ) ; format formátovací řetězec, může obsahovat: přeskok bílých znaků (oddělovačů), tedy mezery, tabulátoru, nového řádku a nové stránky; srovnání znaků formátovacího řetězce se vstupními, je li na vstupu jiný, než určený znak, je čtení ukončeno; specifikace formátu vstupní pro hodnoty, je vždy uvozena znakem %. address určuje pamět ovou oblast (adrasu), do níž bude odpovídající vstupní hodnota uložena (adresa proměnné, ukazatel na pole znaků), výjimkou je použití % je načítána hodnota, nikoliv adresa, viz tabulka přesnost. Návratová hodnota počet bezchybně načtených položek (poĺı), nula je nulový počet uložených položek, EOF je pokus číst další položky po vyčerpání vstupu. Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 15 / 37

Formátová specifikace ve funkci scanf() % [ ] [ width ] [ h l L ] t y p e c h a r položka význam přeskoč popsaný vstup; width maximální počet vstupních znaků; vstupní hodnotu h l L modifikace typu; type char (povinný) typ konverze. načíst, ale do paměti nezapisovat width maximální počet znaků, které budou použity při vstupu (h l) pro celočíselný typ (d) určují short, long; (l L) pro racionální typ (f) float na double, resp. long double Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 16 / 37

Určení typu dat ve funkci scanf() symbol význam d celé číslo; u celé číslo bez znaménka; o osmičkové celé číslo; x šestnáctkové celé číslo; i celé číslo, zápis odpovídá zápisu konstanty jazyka C, například 0x uvozuje celé číslo v šestnáctkové soustavě; n počet dosud přečtených znaků aktuálním voláním funkce scanf(); e, f, g racionální číslo typu float, lze modifikovat pomocí l L; s řetězec, i zde jsou úvodní oddělovače přeskočeny!, v cílovém poli je ukončen \0 ; c vstup znaku, je li určena šířka, je čten řetězec bez přeskočení oddělovačů!; [ search set ] jako s, ale se specifikací vstupní množiny znaků, Petr Šaloun (katedra informatiky FEI jevšb-tu možný Ostrava) i interval, Vstup a výstupnapříklad %[0 9], 24. iříjna negace, 2011 17 / 37

Příklad počítej x 2 zadaného x scanwhil.c ukončení vstupu EOF, Win ctrl z, Unix ctrl d #i n c l u d e <s t d i o. h> i n t main ( void ) { f l o a t f ; p r i n t f ( z a d e j x : ) ; while ( s c a n f ( %f, &f )!= EOF) { p r i n t f ( x=%10.4 f xˆ2=%15.4 f \ n z a d e j x :, f, f f ) ; } return 0 ; } / i n t main ( v o i d ) / x= 2.0000 xˆ2= 4.0000 z a d e j x : 3 x= 3.0000 xˆ2= 9.0000 z a d e j x : 4 x= 4.0000 xˆ2= 16.0000 z a d e j x : ˆ Z Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 18 / 37

Vstupní a výstupní operace v paměti i n t s p r i n t f ( char b u f f e r, const char format [, argum i n t s s c a n f ( const char b u f f e r, const char format [, Vstupní/výstupní řetězec je buffer, ostatní argumenty mají stejný význam jako u funkcí pro formátovaný standardní vstup a výstup. Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 19 / 37

Práce se soubory z konsoly a aplikace Textový obsah přesměrování vstupu a výstupu na úrovni OS z console: c:>app. exe < v s t u p. t x t > v y s t u p. t x t Binární data (pamět disk) bez textové konverze, pevný bajtový formát. jméno souboru v OS vs. identifikátor pro přístup k souboru. Binární vs. textový režim práce s obsahem souboru. Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 20 / 37

Práce se soubory datový proud a přímý přístup proud ISO/ANSI normou jazyka C, tak POSIX, řada modifikátorů, definic a funkcí s definovanými vlastnostmi a rozhraním, doporučený přístup. volání jen POSIX, maximální rychlost (volání služeb jádra operačního systému OS), možná systémová závislost, nedoporučováno. V předmětu Základy programování není součástí látky. FOPEN MAX počet současně otevřených souborů, FILENAME MAX maximální délka jména souboru, EOF konec souboru. Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 21 / 37

Datové proudy FILE datový typ, stdio.h funkční prototypy. Běhová podpora (runtime) vždy otevře: FILE s t d i n ; FILE s t d o u t ; FILE s t d e r r ; Dva režimy proudů (ISO/ANSI norma) textový rozlišuje řádky textu, binární data jako v paměti. Režim stanovíme při otevírání souboru. Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 22 / 37

Otevření datového proudu FILE fopen ( const char f i l e n a m e, const char mode ) ; vrací FILE, nebo NULL při neúspěchu. filename jméno souboru mode režim práce se souborem a typ, například: "a+b", "wb",... textový režim je implicitní, uvést t se doporučuje. Otevření určuje režim přístupu k datům v proudu. Proud lze znovuotevřít či spojit s novým souborem. Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 23 / 37

Režimy práce s datovým proudem řetězec význam (otevření pro:) r čtení; w zápis; a připojení; r+ aktualizace (update) jako rw; w+ jako r+ a existující proud ořízne na nulovou délku; jinak nový soub a+ pro aktualizaci, pokud neexistuje, vytvoří; t textový režim; b binární režim. Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 24 / 37

Zavření/znovuotevření datového proudu i n t f c l o s e ( FILE stream ) ; uzavře proud. úspěch vrátí nulu, jinak EOF. Uvolní pamět vyhrazenou pro strukturu FILE a vyprázdní vyrovnávací pamět, aktualizuje adresářový záznam. FILE f r e o p e n ( const char f i l e n a m e, const char mode, uzavře soubor proudu stream (jako při volání fclose ()), otevře soubor jménem filename (jako při fopen(filename, mode)) návratová hodnota otevřený proud, jinak NULL. Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 25 / 37

Proudy a vstup/výstup znaků Konverze znaku na int po načtení umožní rozlišit případné EOF. Při zápisu do proudu je znak konvertován opačným postupem. i n t g e t c ( FILE stream ) ; úspěch převod (bez znaménka) na typ int. chyba nebo konec proudu vrací EOF. i n t putc ( i n t c, FILE stream ) ; zapíše c do stream a vrátí stejnou hodnotu, jako zapsal. V případě chyby, nebo dosažení konce proudu vrací EOF. i n t ungetc ( i n t c, FILE stream ) ; je li c různé od EOF, pak zápis do stream a případně zruší příznak konce souboru. je li c rovno EOF, nebo nemůže li zápis proběhnout, vrací EOF. Jinak vrací c, přesněji unsigned char c. Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 26 / 37

Datové proudy a vstup/výstup řetězců char f g e t s ( char s, i n t n, FILE stream ) ; načte řetězec (řádek až po jeho konec včetně znaku konce řádku) z proudu stream do vyrovnávací paměti s, nejdéle n 1 znaků. Vrátí ukazatel na řetězec (vyrovnávací pamět ); při chybě NULL. i n t f p u t s ( const char s, FILE stream ) ; zapíše do proudu řetězec ukončený zarážkou. Ani zarážku, ani případný konec řádku (obsažený na konci řetězce) do proudu nezapíše. V případě úspěchu vrátí počet zapsaných znaků (délku řetězce), jinak EOF. gets() nahradí znak konce řádku řetězcovou zarážkou. puts() při zápisu do proudu nahradí zarážku řetězce znakem konce řádku. Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 27 / 37

Formátovaný vstup/výstup z/do proudu i n t f p r i n t f ( FILE stream, const char format [, argument, i n t p r i n t f ( const char format [, argument, i n t f s c a n f ( FILE stream, const char format [, a d d r e s s,... ] ) ; i n t s c a n f ( const char format [, a d d r e s s,... ] ) ; Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 28 / 37

Datové proudy a blokový přenos dat Blokový přenos dat je nezbytný při práci s binárním proudem. size t typ, určuje velikosti pamět ových objektů, případně jejich počet s i z e t f r e a d ( void ptr, s i z e t s i z e, s i z e t n, FILE stream přečte z stream položky o velikosti size v počtu n jednotek do paměti ptr úspěch vrátí počet načtených položek, jinak hodnota menší (pravděpodobně nula). Načtené položky jsou platné. s i z e t f w r i t e ( const void ptr, s i z e t s i z e, s i z e t n, FILE zápis položek do proudu. Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 29 / 37

Datove proudy užitečné funkce i n t f e o f ( FILE stream ) ; true (tj. různá od nuly), nacházíme se na konci proudu false (nula) jinak. i n t f f l u s h ( FILE stream ) ; vyprázdní bafr souboru (zápis). vrací: nula = úspěch, EOF signalizuje chybu. i n t f s e e k ( FILE stream, long o f f s e t, i n t whence ) ; přenese aktuální pozici CP v proudu stream na stanovené místo; offset posun; whence je vztažný bod: SEEK SET, SEEK CUR, SEEK END. Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 30 / 37

Datove proudy další užitečné funkce long f t e l l ( FILE stream ) ; vrátí aktuální pozici v proudu pro binární proud = počet bajtů vzhledem k začátku, -1L = chyba + nastaví globální proměnnou errno. ferror () informuje o případné chybě při práci s proudem. clearerr () ruší nastavení příznaku chyby a konce proudu. perror () pošle řetězec chybového hlášení do stderr. tmpfile () otevře přechodný soubor v binárním režimu pro aktualizaci. (souvisí s: tmpnam() a tempnam()). fgetpos() a fsetpos () umožňují uchovat (získat) pozici v proudu a pak ji (opětně) nastavit. setbuf () a setvbuf () umožňují nastavit a případně modifikovat velikost vyrovnávací paměti pro určený proud. Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 31 / 37

Tvorba textového souboru, datový proud io pv04.c II i n t main ( void ) { FILE soubor ; i n t i ; char s, jmeno = soubor. t x t ; i f ( ( soubor = fopen ( jmeno, wt ) ) == NULL) chyba ( 1 ) ; s = Toto j e t e x t o v y soubor v y t v o r e n y v C. \ n p r i s t u p pomoci proudu FILE \n ; f p u t s ( s, soubor ) ; f o r ( i = 1 ; i < 1 0 ; i ++) f p r i n t f ( soubor, %5d, i ) ; f p u t s ( \n\n, soubor ) ; s= Uz to umim! \ n ; f p u t s ( s, soubor ) ; s= J e s t e p r i d a t p o s l e d n i radek na konec. ; f p u t s ( s, so i f ( f c l o s e ( soubor ) == EOF) chyba ( 1 ) ; return 0 ; } / i n t main ( v o i d ) / Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 32 / 37

Tvorba textového souboru, datový proud io pv04.c I / soubor IO DP01. C / #i n c l u d e <s t d i o. h> #i n c l u d e <i o. h> #i n c l u d e < f c n t l. h> #i n c l u d e <p r o c e s s. h> #i n c l u d e <s t r i n g. h> #i n c l u d e <s y s \ s t a t. h> void chyba ( i n t e r ) { extern i n t e r r n o ; i f ( e r!= 0) { p e r r o r ( s t r e r r o r ( e r r n o ) ) ; e x i t ( e r r n o ) ; } return e r ; } / v o i d chyba ( i n t e r ) / Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 33 / 37

Tvorba textového souboru, datový proud io pv04.c vystup C t e n i t e x t o v e h o souboru <soubor. txt > funkcemi pro dato Toto j e t e x t o v y soubor v y t v o r e n y v C. p r i s t u p pomoci proudu FILE 1 2 3 4 5 6 7 8 9 Uz to umim! J e s t e p r i d a t p o s l e d n i radek na konec.... KONEC... Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 34 / 37

Čtení textového souboru, datový proud io dp02.c I #i n c l u d e <s t d i o. h> #i n c l u d e <i o. h> #i n c l u d e < f c n t l. h> #i n c l u d e <p r o c e s s. h> #i n c l u d e <s y s \ s t a t. h> #i n c l u d e <s t r i n g. h> const i n t MAX DELKA RADKU = 8 1 ; void chyba ( i n t e r ) { extern i n t e r r n o ; i f ( e r!= 0) { p e r r o r ( s t r e r r o r ( e r r n o ) ) ; e x i t ( e r r n o ) ; } } / v o i d chyba ( i n t e r ) / Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 35 / 37

Čtení textového souboru, datový proud io dp02.c II i n t c t i r a d e k ( FILE f, char radek, i n t max) { i n t i = 0, ch = 0 ; char s = radek ; while ( ( i < max) && ( ( ch = g e t c ( f ) )!= EOF) && ( ch!= \n ) ) { s [ i ] = ch ; i ++; } s [ i ] = \ x0 ; return ( ch == EOF)? ch : ( ( i == 0)? 1 : i ) ; } / i n t c t i r a d e k ( i n t hdl, char radek, i n t max) / Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 36 / 37

Čtení textového souboru, datový proud io dp02.c III i n t main ( void ) { i n t nacteno ; FILE soubor ; char s [MAX DELKA RADKU], jmeno = soubor. t x t ; i f ( ( soubor=fopen ( jmeno, r t ))==NULL) chyba ( 1 ) ; p r i n t f ( \ n C t e n i t e x t o v e h o souboru <%s> funkcemi pro datovy while ( ( nacteno=c t i r a d e k ( soubor, s, s i z e o f ( s ) 1))!= EOF){ p r i n t f ( %s \n, s ) ; s = 0 x0 ; } i f ( ( nacteno == EOF) && ( s t r l e n ( s )!= 0 ) ) p r i n t f ( %s \n\n... KONEC... \ n, s ) ; e l s e chyba ( nacteno ) ; i f ( f c l o s e ( soubor ) == 1) chyba ( 1 ) ; return 0 ; } / i n t main ( v o i d ) / Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Vstup a výstup 24. října 2011 37 / 37