Vstupn a vstupn operace 1 Jazyk C poskytuje

  • Slides: 29
Download presentation
Vstupní a výstupní operace (1) • Jazyk C poskytuje sadu V/V (vstupních/výstupních) operací, které

Vstupní a výstupní operace (1) • Jazyk C poskytuje sadu V/V (vstupních/výstupních) operací, které jsou založeny na koncepci tzv. proudů (stream) • Proudem může být soubor nebo jiný zdroj, resp. příjemce dat (včetně terminálu nebo jiného fyzického zařízení) • Informace o proudu jsou ukládány v datovém typu FILE (struktura definovaná v hlavičkovém souboru stdio. h) 2021 -09 -14 1

Vstupní a výstupní operace (2) • Mezi informacemi, které jsou ukládány ve struktuře FILE,

Vstupní a výstupní operace (2) • Mezi informacemi, které jsou ukládány ve struktuře FILE, je např. : – současná pozice v rámci proudu (tzv. indikátor pozice): • určuje, od jakého místa bude prováděn zápis, resp. od jakého místa bude prováděno čtení • každá operace čtení (zápisu) provede posunutí indikátoru pozice za poslední načtený (zapsaný) znak (byte) – ukazatel na připojené vyrovnávací paměti – indikátor chyby – indikátor konce souboru 2021 -09 -14 2

Vstupní a výstupní operace (3) • Existují dva formáty proudů: – textový: • posloupnost

Vstupní a výstupní operace (3) • Existují dva formáty proudů: – textový: • posloupnost znaků, která je rozdělena do řádků (proměnlivé délky) • každý řádek se skládá z žádného, jednoho nebo více znaků následovaných znakem nový řádek ’n’ – binární: • posloupnost hodnot typu char (hodnoty typu char jsou celá čísla a zaujímají v operační paměti 1 B) • libovolná data v jazyku C se mohou převést na pole hodnot typu char (na posloupnost bytů) • může transparentně zaznamenat interní data 2021 -09 -14 3

Vstupní a výstupní operace (4) • Jakmile dojde ke spuštění programu v jazyku C,

Vstupní a výstupní operace (4) • Jakmile dojde ke spuštění programu v jazyku C, automaticky se pro něj otevírají tři předdefinované proudy: – stdin: • standardní vstup • obvykle je pro něj použita klávesnice počítače – stdout: • standardní výstup • většinou reprezentuje obrazovku monitoru – stderr: • standardní výstup pro chybová hlášení • obvykle spojen s obrazovkou monitoru 2021 -09 -14 4

Práce se soubory (1) • Programy v jazyku C mohou (prostřednictvím proudů) přistupovat k

Práce se soubory (1) • Programy v jazyku C mohou (prostřednictvím proudů) přistupovat k datům uloženým v souborech, které se nacházejí na externích paměťových médiích (FD, HDD, CD, DVD, BD, tape apod. ) • Data ze souborů mohou být načítána do operační paměti, kde je provedeno jejich zpracování, a rovněž mohou být z operační paměti do souborů zapisována 2021 -09 -14 5

Práce se soubory (2) • Pro práci soubory je zapotřebí v programu definovat proměnnou

Práce se soubory (2) • Pro práci soubory je zapotřebí v programu definovat proměnnou jako ukazatel na hodnotu typu FILE • Přiklad: FILE *soubor; definuje proměnnou soubor, která může následně sloužit pro práci se souborem uloženým na externím paměťovém médiu • Se soubory (proudy) lze pracovat pomocí knihovních funkcí 2021 -09 -14 6

Práce se soubory (3) • Funkce fopen: – deklarována v: stdio. h – prototyp:

Práce se soubory (3) • Funkce fopen: – deklarována v: stdio. h – prototyp: FILE *fopen(const char *fname, const char *mode); – funkce: • otevírá (popř. vytváří) soubor se jménem fname v režimu mode • otevřený (vytvořený) soubor je pak spojen s proudem • parametr mode může nabývat hodnoty: 2021 -09 -14 – ”r” – otevírá soubor pro čtení (soubor musí existovat) – ”w” – vytváří nový (prázdný) soubor pro zápis – jestliže soubor již existuje, pak je přepsán soubo 7 rem novým

Práce se soubory (4) – ”a” – otevírá existující soubor pro přidání dat na

Práce se soubory (4) – ”a” – otevírá existující soubor pro přidání dat na jeho konec – jestliže soubor neexistuje, pak je vytvořen nový (prázdný) soubor, na jehož konec je možné zapisovat – ”r+” – otevírá soubor pro čtení i zápis (soubor musí existovat) – ”w+” – vytváří nový (prázdný) soubor pro čtení i zápis – jestliže soubor již existuje, pak je přepsán souborem novým – ”a+” – otevírá existující soubor pro čtení a přidání dat na jeho konec – jestliže soubor neexistuje, pak je vytvořen nový (prázdný) soubor, z nějž je možné číst a na jehož konec je možné zapisovat • na konci parametru mode (popř. před znakem +) může 2021 -09 -14 být ještě znak b, který způsobí, že se souborem se bude 8 pracovat jako se souborem binárním (nikoliv textovým)

Práce se soubory (5) mode r w a r+ w+ a+ Jmenovaný soubor již

Práce se soubory (5) mode r w a r+ w+ a+ Jmenovaný soubor již musí existovat ano ne ne Obsah existujícího souboru se ztrácí ne ano ne Čtení ze souboru povoleno ano ne ne ano ano Zápis do souboru povolen ne ano ano ano Zápis povolen pouze na konci souboru ne ne ano 2021 -09 -14 9

Práce se soubory (6) – vrácená hodnota: • v případě, že se soubor podaří

Práce se soubory (6) – vrácená hodnota: • v případě, že se soubor podaří otevřít (vytvořit), pak funkce vrací ukazatel typu FILE *, který určuje proud pro další vstupní nebo výstupní operace • jestliže se soubor nepodaří otevřít (nastane chyba): – vrací NULL – kód chyby uloží do proměnné errno – poznámka: • je-li soubor otevřen pro čtení i zápis, pak by mezi vstupní operací následovanou výstupní operací (nebo výstupní operací následovanou vstupní operací) mělo být provedeno vyprázdnění vyrovnávacích pamětí (fflush) • vyprázdnění vyrovnávacích pamětí provádějí i funkce manipulující s indikátorem pozice (fseek, rewind) 2021 -09 -14 10

Práce se soubory (7) • Funkce fclose: – deklarována v: stdio. h – prototyp:

Práce se soubory (7) • Funkce fclose: – deklarována v: stdio. h – prototyp: int fclose(FILE *stream); – funkce: • uzavírá otevřený soubor spojený s proudem stream • vyprazdňuje vyrovnávací paměti – vrácená hodnota: • 0 při úspěšném uzavření • EOF při vzniku chyby 2021 -09 -14 11

Práce se soubory (8) • Funkce fflush: – deklarována v: stdio. h – prototyp:

Práce se soubory (8) • Funkce fflush: – deklarována v: stdio. h – prototyp: int fflush(FILE *stream); – funkce: • vyprazdňuje vyrovnávací paměti spojené s proudem stream • proud zůstává otevřený – vrácená hodnota: • 0 při úspěšném provedení • EOF při vzniku chyby 2021 -09 -14 12

Práce se soubory (9) • Funkce fseek: – deklarována v: stdio. h – prototyp:

Práce se soubory (9) • Funkce fseek: – deklarována v: stdio. h – prototyp: int fseek(FILE *stream, long int offset, int wherefrom); – funkce: • nastavuje indikátor pozice v souboru spojeném s proudem stream podle hodnoty specifikované parametrem offset • parametr offset (číslo se znaménkem) určuje počet znaků (bytů) 2021 -09 -14 13

Práce se soubory (10) • parametr wherefrom označuje místo v souboru, od kterého se

Práce se soubory (10) • parametr wherefrom označuje místo v souboru, od kterého se má měřit offset • wherefrom může mít hodnotu: – SEEK_SET – SEEK_CUR – SEEK_END offset je měřen od začátku souboru offset je měřen od aktuální pozice offset je měřen od konce souboru – vrácená hodnota: • 0 • různá od nuly při úspěšné změně pozice při vzniku chyby – poznámka: • používána zejména u binárních souborů • pro textové soubory by hodnota offset měla být buď nula, nebo hodnota vrácená funkcí ftell 2021 -09 -14 14

Práce se soubory (11) • Funkce ftell: – deklarována v: stdio. h – prototyp:

Práce se soubory (11) • Funkce ftell: – deklarována v: stdio. h – prototyp: long int ftell(FILE *stream); – funkce: • zjišťuje aktuální pozici (hodnotu indikátoru pozice) v souboru spojeném s proudem stream – vrácená hodnota: • aktuální hodnota indikátoru pozice souboru • u binárních souborů odpovídá počtu znaků (bytů), které jsou v souboru před současnou pozicí • v případě chyby vrací hodnotu – 1 a nastaví proměnnou errno na hodnotu vyjadřující chybu 2021 -09 -14 15

Práce se soubory (12) • Funkce rewind: – deklarována v: stdio. h – prototyp:

Práce se soubory (12) • Funkce rewind: – deklarována v: stdio. h – prototyp: void rewind(FILE *stream); – funkce: • nastavuje indikátor pozice na začátek souboru spojeného s parametrem stream • shodné s fseek(stream, 0, SEEK_SET); – vrácená hodnota: • funkce nevrací žádnou hodnotu 2021 -09 -14 16

Práce se soubory (13) • Funkce fgetc: – deklarována v: stdio. h – prototyp:

Práce se soubory (13) • Funkce fgetc: – deklarována v: stdio. h – prototyp: int fgetc(FILE *stream); – funkce: • čte jeden znak ze souboru spojeného s proudem stream • posunuje indikátor pozice o jeden znak (indikátor pozice bude ukazovat na následující znak) – vrácená hodnota: • načtený znak jako hodnota typu int • nastane-li chyba, nebo je-li proud na konci souboru, pak vrací hodnotu EOF 2021 -09 -14 17

Práce se soubory (14) • Funkce fputc: – deklarována v: stdio. h – prototyp:

Práce se soubory (14) • Funkce fputc: – deklarována v: stdio. h – prototyp: int fputc(int c, FILE *stream); – funkce: • zapisuje znak c (specifikovaný jako hodnota typu int) do souboru spojeného s proudem stream • posunuje indikátor pozice za zapsaný znak – vrácená hodnota: • zapsaný znak • nastane-li chyba, pak vrací hodnotu EOF • Poznámka: – pro načtení řetězce ze souboru je možné použít funkci fgets (viz řetězce) 2021 -09 -14 18

Práce se soubory (15) • Funkce fputs: – deklarována v: stdio. h – prototyp:

Práce se soubory (15) • Funkce fputs: – deklarována v: stdio. h – prototyp: int fputs(const char *s, FILE *stream); – funkce: • zapisuje znaky řetězce s (kromě ukončovacího znaku ’’) do souboru spojeného s proudem stream • posunuje indikátor pozice za poslední zapsaný znak – vrácená hodnota: • v případě úspěšného zápisu vrací nezápornou hodnotu • nastane-li chyba, pak vrací hodnotu EOF 2021 -09 -14 19

Práce se soubory (16) • Funkce fscanf: – deklarována v: stdio. h – prototyp:

Práce se soubory (16) • Funkce fscanf: – deklarována v: stdio. h – prototyp: int fscanf(FILE *stream, const char *format, …); – funkce: • pracuje podobně jako funkce scanf • pro parametr format platí stejná pravidla jako u funkce scanf • znaky nejsou načítány ze standardního vstupu, ale ze souboru spojeného s proudem stream • posunuje indikátor pozice za poslední načtený znak 2021 -09 -14 20

Práce se soubory (17) • Funkce fprintf: – deklarována v: stdio. h – prototyp:

Práce se soubory (17) • Funkce fprintf: – deklarována v: stdio. h – prototyp: int fprintf(FILE *stream, const char *format, …); – funkce: • pracuje podobně jako funkce printf • pro parametr format platí stejná pravidla jako u funkce printf • posloupnost dat specifikovaná parametrem format není vypisována na standardní výstup, ale je ukládána do souboru spojeného s proudem stream • posunuje indikátor pozice za poslední zapsaný znak 2021 -09 -14 21

Práce se soubory (18) • Funkce fread: – deklarována v: stdio. h – prototyp:

Práce se soubory (18) • Funkce fread: – deklarována v: stdio. h – prototyp: size_t fread(void *ptr, size_t element_size, size_t count, FILE *stream); – funkce: • provádí načítání hodnot z binárního souboru spojeného s proudem stream • ptr je ukazatel na pole obsahující count prvků, které budou načítány a z nichž každý má velikost element_size • posunuje indikátor pozice za poslední načtený byte 2021 -09 -14 22

Práce se soubory (19) – vrácená hodnota: • skutečný počet načtených prvků: – může

Práce se soubory (19) – vrácená hodnota: • skutečný počet načtených prvků: – může být menší než count, dosáhne-li se konce souboru • v případě chyby vrací hodnotu nula • Funkce fwrite: – deklarována v: stdio. h – prototyp: size_t fwrite(void *ptr, size_t element_size, size_t count, FILE *stream); 2021 -09 -14 23

Práce se soubory (20) – funkce: • zapisuje hodnoty do binárního souboru spojeného s

Práce se soubory (20) – funkce: • zapisuje hodnoty do binárního souboru spojeného s proudem stream • ptr je ukazatel na pole obsahující count prvků, které budou zapisovány a z nichž každý má velikost element_size • posunuje indikátor pozice za poslední zapsaný znak – vrácená hodnota: • skutečný počet zapsaných prvků • jestliže vrácená hodnota je různá od hodnoty count, pak při zápisu nastala chyba 2021 -09 -14 24

Práce se soubory (21) • Funkce feof: – deklarována v: stdio. h – prototyp:

Práce se soubory (21) • Funkce feof: – deklarována v: stdio. h – prototyp: int feof(FILE *stream); – funkce: • testuje, zda-li při čtení ze souboru spojeného s proudem stream bylo dosaženo jeho konce – vrácená hodnota: • 0 jestliže nebylo dosaženo konce souboru • různá od nuly jestliže bylo dosaženo konce souboru 2021 -09 -14 25

Práce se soubory (22) • Funkce ferror: – deklarována v: stdio. h – prototyp:

Práce se soubory (22) • Funkce ferror: – deklarována v: stdio. h – prototyp: int ferror(FILE *stream); – funkce: • testuje, zda-li při práci se souborem spojeným s proudem stream nedošlo k chybě – vrácená hodnota: • 0 v případě, že žádná chyba nenastala • různá od nuly jestliže při práci se souborem došlo k chybě 2021 -09 -14 26

Práce se soubory (23) • Funkce clearerr: – deklarována v: stdio. h – prototyp:

Práce se soubory (23) • Funkce clearerr: – deklarována v: stdio. h – prototyp: void clearerr(FILE *stream); – funkce: • resetuje indikátor chyby a konce souboru spojeného s proudem stream • následující volání funkce ferror nebude hlásit žádnou chybu – vrácená hodnota: • funkce nevrací žádnou hodnotu 2021 -09 -14 27

Práce se soubory (24) • Funkce remove: – deklarována v: stdio. h – prototyp:

Práce se soubory (24) • Funkce remove: – deklarována v: stdio. h – prototyp: int remove(const char *filename); – funkce: • odstraní (zruší) soubor specifikovaný parametrem filename – vrácená hodnota: • 0 jestliže operace proběhla úspěšně • různá od nuly při vzniku chyby 2021 -09 -14 28

Práce se soubory (25) • Funkce rename: – deklarována v: stdio. h – prototyp:

Práce se soubory (25) • Funkce rename: – deklarována v: stdio. h – prototyp: int rename(const char *oldname, const char *newname); – funkce: • změní jméno souboru oldname na newname – vrácená hodnota: • 0 jestliže operace proběhla úspěšně • různá od nuly při vzniku chyby 2021 -09 -14 29