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

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

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

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

vstup a výstupy jazyce C

vstup a výstupv jazyce C

Vstup a výstup datové proudy v C

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

VISUAL BASIC. Práce se soubory

vstup a výstupy jazyce C

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

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

Dynamická vícerozměrná pole. Základy programování 2 Tomáš Kühr

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

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

Úvod do programování. Lekce 1

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

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

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

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)

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

Standardní vstup a výstup

Struktury a dynamická paměť

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

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

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

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

PB071 Programování v jazyce C

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

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

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

Soubor jako posloupnost bytů

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

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

Úvod do programování 8. hodina

Základy programování (IZP)

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

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

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Typové a netypové soubory

Práce se soubory v Javě

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

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

Knihovna DataBoxLib TXV první vydání prosinec 2010 změny vyhrazeny

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

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

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Textové soubory

Algoritmizace a programování

Lineární spojový seznam (úvod do dynamických datových struktur)

Vícerozměrná pole. Úvod do programování 2 Tomáš Kühr

Princip funkce počítače

ALGORITMY A PROGRAMOVÁNÍ V JAZYCE C/C++

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

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

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

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

Dílčí příklady použití jazykových konstrukcí v projektu. Jazyk C Příklady. Pravidla překladu v gmake. Zadání

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

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N

Úvod do programování. Lekce 3

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

8. přednáška: Soubory a proudy

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

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

Základy programování (IZP)

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

Ošetřování chyb v programech

C# konzole Podíl dvou čísel, podmínka IF

Systém souborů Mgr. Josef Horálek

Př. další použití pointerů

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

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

Čtvrtek 3. listopadu. Makra v Excelu. Obecná definice makra: Spouštění makra: Druhy maker, způsoby tvorby a jejich ukládání

Projektč.3dopředmětuIZP. Maticové operace

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

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky -

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

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

Algoritmizace a programování

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

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Algoritmy I. Cvičení č. 2, 3 ALGI 2018/19

Práce s pamětí a předávání parametrů. Úvod do programování 1

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

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

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

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

O datových typech a jejich kontrole

Popis funkcí exportovaných z knihovny nddbe.dll

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

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

Algoritmizace a programování

Základy programování (IZP)

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ý

Základní datové struktury

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

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

Pointery II. Jan Hnilica Počítačové modelování 17

Základy programování (IZP)

Transkript:

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

Soubory z pohledu C u Soubor chápeme jako posloupnost bytů uložených na disku u Datový proud (anglicky stream) u Ještě obecnější přístup u Sjednocuje pohled na soubory a vstupní/výstupní zařízení u Přístup k disku je pomalejší než k paměti buffering / bufferování / bufrování u Buffering vstupu u Do paměti (buffer) se načte blok dat určité a předem dané velikosti u Jednotlivé hodnoty se čtou z této paměti u Pokud je třeba, načte se do paměti další blok dat u Buffering výstupu u Data se zapisují do paměti u Pokud je paměť plná, zapíše se její obsah na disk

Textové soubory

Začátek práce se souborem u Všechny zmiňované funkce, proměnné a datové jsou definovány v stdio.h u Se soubory pracujeme prostřednictvím ukazatelů na strukturovaný typ FILE FILE *identifikator; u Nejprve je potřeba soubor otevřít pomocí funkce fopen FILE *fopen(char *filename, char *mode); u První parametr funkce určuje jméno souboru (případně i cestu) u Druhý parametr určuje, jak se bude se souborem pracovat (viz dále) u Funkce vrací ukazatel na soubor nebo NULL, pokud dojde k chybě u Příklad: FILE *mujsoubor; mujsoubor = fopen("./data/info.txt", "r+t"); if (!mujsoubor) exit(1);

Způsoby otevření souboru u Jsou určeny hodnotou řetězce mode u Určují další možnosti práce s otevřeným souborem u Módy otevření: u "r" otevření pro čtení, soubor musí existovat u "w" otevření pro zápis, existující soubor se přepíše, neexistující se vytvoří u "a" rozšiřování existujícího souboru, neexistující soubor bude vytvořen u "r+", "w+", "a+" - rozšířené módy, umožňují jak čtení, tak zápis u Za výše uvedenými řetězci může následovat znak: u b pro označení binárních souborů u t (nebo nic) pro označení textových souborů

Čtení ze souboru u Soubor musí být otevřen v módu podporujícím čtení u Čtení jednoho znaku int getc(file *f); u Čtení řádku char *fgets(char *str, int length, FILE *f); u Do str se ze souboru f načte nejvýše jeden řádek (včetně '\n') u Maximálně se ale přečte length 1 znaků u Formátované čtení int fscanf(file *f, const char *format,...); u Po každém čtení se automaticky posouvá pozice v souboru u Pokud nelze z datového proudu číst, vrací funkce EOF nebo NULL u Chybová návratová hodnota se vrací i v případě čtení na konci souboru

Zápis do souboru u Soubor musí být otevřen v módu podporujícím zápis u Zápis znaku int putc(int c, FILE *f); u Zápis řetězce int fputs(const char *s, FILE *f); u Formátovaný zápis int fprintf(file *f, const char *format,...); u Každý následující zápis se provede automaticky za dříve zapsaná data u Pokud dojde k chybě při zápisu, vrací výše uvedené funkce hodnotu EOF

Ukončení práce se souborem u Počet současně otevřených souborů je omezen u Pokud při běhu programu dojde k závažné chybě (např. výpadek el. proudu), data zapsaná pouze do bufferu budou ztracena u Vyprázdnění bufferu int fflush(file *f); u V případě vstupu - zahození obsahu bufferu a načtení nového bloku u Toto se používá nejčastěji ve spojení se standardním vstupem (viz dále) u V případě výstupu - vynucení zápisu obsahu bufferu na disk u Zavření proudu (včetně vyprázdnění bufferu) int fclose(file *f); u V případě neúspěchu vracejí obě funkce hodnotu EOF

Standardní datové proudy u Načítání dat a výpisy pomocí konzole jsou realizovány datovými proudy u Po spuštění programu jsou vytvořeny datové proudy FILE *stdin; FILE *stdout; FILE *stderr; u stdin pro čtení (implicitně z konzole) u stdout pro zápis (implicitně do konzole) u stderr pro zápis (chybový výpis, implicitně do konzole) u Implicitní nastavení proudů lze změnit za běhu programu (viz dále) u Nebo již při spouštění programu z příkazové řádky program.exe < vstup.txt > vystup.txt 2> chyby.txt

Binární soubory

Binární soubory u Mohou mít libovolnou strukturu u Data jsou uložena obvykle ve stejné podobě jako v proměnných u Výhody: u Pro uložení je potřeba obvykle méně místa než u textových souborů u Nejsou potřeba konverze čísel na textové řetězce a naopak u Zápis i čtení dat bývají díky tomu rychlejší u Nevýhody u Nelze je rozumně vytvářet, číst, editovat v textových editorech u Binární soubory nejsou obecně přenositelné u Po otevření binárního souboru se implicitně neprovádí žádné úpravy (např. transformace zakódování konců řádků na \n )

Čtení bloků dat daného typu u Čtení bloku dat lze provést voláním funkce size_t fread(void *kam, size_t rozmer, size_t pocet, FILE *f) u f je datový proud, ze kterého se čte u rozmer je velikost jedné položky u pocet udává počet položek u kam je adresa paměti, do které se data ukládají u vrací počet úspěšně přečtených položek u Příklad použití: #define VELIKOST_BLOKU 10... int data[velikost_bloku]; FILE *fr = fopen("a.dat", "rb");... fread(data, sizeof(int), VELIKOST_BLOKU, fr);

Zápis bloku dat daného typu u Zápis bloku dat lze provést voláním funkce size_t fwrite(void *zdroj, size_t rozmer, size_t pocet, FILE *f) u f je datový proud, do kterého zapisujeme u rozmer je velikost jedné položky u pocet udává počet položek u zdroj je adresa dat, která chceme zapisovat u vrací počet úspěšně zapsaných položek u Příklad použití: #define VELIKOST_BLOKU 10... int data[velikost_bloku]; FILE *fw = fopen("out.dat", "wb");... fwrite(data, sizeof(int), VELIKOST_BLOKU,fw);

Posunutí se v souboru u Obvykle data čteme / zapisujeme sekvenčně od začátku souboru u Občas ale potřebujeme k datům přistupovat i jinak u Posouvání se v souboru pomocí int fseek(file *f, long posun, int odkud) u posun udává, o kolik bytů se posouváme u záporný posun odpovídá směru k začátku souboru ukladný posun pak směru ke konci souboru u odkud udává výchozí pozici a bývá dáno jednou z konstant: useek_set (od začátku souboru) useek_cur (od aktuální pozice) useek_end (od konce souboru) u vrací nulu v případě úspěchu, jinak nenulovou hodnotu

Zjištění aktuální pozice u Funkce pro zjištění aktuální pozice v souboru long ftell(file *f) u vrací aktuální posunutí od začátku souboru v bytech u Příklad použití: /* navrat na puvodni misto */ long akt_pos = ftell(f); fseek(f, 0L, SEEK_SET); if (vyhledej(f, "ahoj") == NULL) fseek(f, akt_pos, SEEK_SET); u Vstupní operace nemá přímo následovat po výstupní operaci nebo naopak bez předchozího volání fseek u Občas se nic nestane, občas to působí špatně laditelné chyby u V případě potřeby pomůže fseek(f, 0L, SEEK_CUR);

Další drobnosti

Vrácení znaku do bufferu u V programech se někdy dozvíme o tom, že máme přestat číst až ve chvíli, kdy jsme přečetli jeden znak navíc u Funkce pro virtuální vrácení znaku do bufferu int ungetc(int c, FILE *f); u Při úspěšném provedení je návratovou hodnotou vrácený znak c, jinak EOF u Doporučuje se nevolat víckrát po sobě u Lze vrátit i jiný znak než ten, který se dříve přečetl

Změny v nastavení bufferování u O vytvoření a používání bufferu se obvykle sami nestaráme u Funkce pro přiřazení vlastního bufferu nově otevřenému proudu void setbuf(file *f, char *buffer) u buffer musí mít velikost minimálně BUFSIZ bytů u při použití hodnoty NULL, dojde k vypnutí bufferování u Funkce s více možnostmi void setvbuf(file *f, char *buffer, int mode, size_t size) u mode umožňuje nastavit režim bufferování u_iofbf data se načítají do zaplnění bufferu u_iolbf do konce řádky nebo do zaplnění bufferu u_ionbf vypnutí bufferování u Parametr size umožňuje zadat velikost bufferu

Dočasné soubory u Vytvoření dočasného souboru FILE *tmpfile() u Otevře soubor v režimu "w+b" u Po uzavření se tento automaticky smaže u Vrací ukazatel na vytvořený soubor nebo NULL u Pokud chceme dočasný soubor používat jiným způsobem, musíme si jej otevřít sami (pomocí fopen) u Pro generování jmen pomocných souborů lze použít char *tmpnam(char *str) u Generuje unikátní název souboru v daném adresáři u Uloží vygenerovaný řetězec do str a vrací ho i jako návratovou hodnotu u Pokud má str hodnotu NULL, alokuje se i paměť pro výsledný řetězec

Další užitečné funkce u Přesměrování proudu za běhu programu FILE *freopen(const char *name, const char *mode, FILE *f) u Otevře soubor name v režimu mode u Přesměruje do nově otevřeného souboru proud f u Používá se pro přesměrování standardních proudů do souborů u Při úspěchu vrací ukazatel na proud, jinak NULL u Přejmenování souboru int rename(const char *old_name, const char *new_name) u V případě úspěchu vrací nulu, jinak nenulovou hodnotu u Smazání souboru int remove(const char *name) u V případě úspěchu vrací nulu, jinak nenulovou hodnotu