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

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

Vstup a výstup datové proudy v C

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

VISUAL BASIC. Práce se soubory

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

Úvod do programování. Lekce 1

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

vstup a výstupy jazyce C

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

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

Základy programování (IZP)

Standardní vstup a výstup

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

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.

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

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

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

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

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

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:

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

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

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)

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

Struktury a dynamická paměť

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

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

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

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

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

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

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

Algoritmizace a programování

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

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

Princip funkce počítače

Soubor jako posloupnost bytů

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

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

Úvod do programování 8. hodina

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

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

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

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

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

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

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

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

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

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

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

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

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 -

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

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

Práce se soubory v Javě

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

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

Ošetřování chyb v programech

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

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

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

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

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

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

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

Popis funkcí exportovaných z knihovny nddbe.dll

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

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

Programovací jazyk Pascal

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

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

Základy programování (IZP)

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

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

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

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

Algoritmizace a programování

Připravil: David Procházka. Vertex Buffer Objects

Přerušovací systém s prioritním řetězem

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

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

Standardní knihovny C. Rekurze.

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

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

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

O datových typech a jejich kontrole

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

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

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

POČÍTAČE A PROGRAMOVÁNÍ

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Transkript:

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

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

Textové soubory

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

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

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

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

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

Standardní datové proudy Načítání z klávesnice a výpis na obrazovku je také realizováno datovými proudy S těmito standardními proudy lze pracovat podobně jako se souborovými proudy V stdio.h jsou definovány proměnné FILE *stdin; FILE *stdout; FILE *stderr; Tyto datové proudy jsou otevřeny již při spuštění programu stdin pro čtení (implicitně z klávesnice) stdout pro zápis (běžný, implicitně na obrazovku) stderr pro zápis (chybový, implicitně na obrazovku) Implicitní nastavení proudů lze změnit za běhu programu I při jeho spouštění z příkazové řádky program.exe < vstup.txt > vystup.txt

Binární soubory

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

Čtení bloků dat daného typu Čtení bloku dat lze provést voláním funkce fread ze stdio.h size_t fread(void *kam, size_t rozmer, size_t pocet, FILE *f) f je datový proud, ze kterého se čte rozmer je velikost jedné položky pocet udává počet položek kam je adresa paměti, do které se data ukládají Vrací počet úspěšně přečtených položek 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 Zápis bloku dat lze provést voláním funkce fwrite ze stdio.h size_t fwrite(void *zdroj, size_t rozmer, size_t pocet, FILE *f) f je datový proud, do kterého zapisujeme rozmer je velikost jedné položky pocet udává počet položek zdroj je adresa dat, která chceme zapisovat Vrací počet úspěšně zapsaných položek 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 Běžně se data postupně čtou/zapisují od začátku souboru Občas ale potřebujeme k datům přistupovat jinak než sekvenčně Hodí se tedy funkce pro posouvání se v souboru, definována v stdio.h int fseek(file *f, long posun, int odkud) posun udává, o kolik bytů se posouváme Záporný posun odpovídá směru zpět (k začátku souboru) Kladný posun pak směru dopředu (ke konci souboru) odkud udává výchozí pozici pro výpočet posunu Pozice může být dána jednou z následujících konstant: SEEK_SET (od začátku souboru) SEEK_CUR (od aktuální pozice) SEEK_END (od konce souboru) Funkce vrací nulu v případě úspěchu, jinak nenulovou hodnotu

Zjištění aktuální pozice v souboru Spolu s funkcí fseek se často používá i funkce pro zjištění aktuální pozice long ftell(file *f) Vrací aktuální posunutí od začátku souboru f v bytech Příklad použití: /* navrat na puvodni misto*/ akt_pos = ftell(f); fseek(f, 0L, SEEK_SET); if (hledej(f, "ahoj") == NULL) fseek(f, akt_pos, SEEK_SET); Vstupní operace nesmí přímo následovat po výstupní operaci nebo naopak bez předchozího volání fseek Občas se nic neděje, občas to působí špatně laditelné problémy V případě potřeby stačí fseek(f, 0L, SEEK_CUR);

Další drobnosti

Vrácení 1 znaku/bytu do bufferu Může se občas hodit... V reálných aplikacích 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 Funkce pro virtuální vrácení znaku do bufferu int ungetc(int c, FILE *f); Při úspěšném provedení je návratovou hodnotou vrácený znak c, jinak EOF Doporučuje se nevolat vícekrát po sobě Lze vrátit i jiný znak než ten, který se dříve přečetl

Změny v nastavení bufferování Jako buffer můžeme proudu přiřadit po jeho otevření jakoukoli alokovanou paměť Lze k tomu použít funkci setbuf, která je deklarovaná v stdio.h void setbuf(file *f, char *buffer) Paměť buffer musí mít velikost minimálně BUFSIZ bytů Pokud má parametr buffer hodnotu NULL, dojde k vypnutí bufferování Existuje i funkce umožňující komplexnější nastavení bufferu (opět ze stdio.h) void setvbuf(file *f, char *buffer, int mode, size_t size) I zde je doporučené volat funkci ihned po otevření proudu mode umožňuje nastavit režim bufferování _IOFBF data se načítají do zaplnění bufferu _IOLBF do konce řádky nebo do zaplnění bufferu _IONBF vypnutí bufferování Parametr size umožňuje zadat velikost bufferu

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

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