Standardní knihovní funkce pro práci se soubory

Post on 08-Jan-2016

38 views 1 download

description

Verze 2009.01. Standardní knihovní funkce pro práci se soubory. 13. A1PRG - Programování – Seminář Ing. Michal Heczkoheczko@fai.utb.cz. Agenda. Standardní knihovní funkce pro práci se soubory. Typy souborů. Textové soubory Binární soubory. Textové soubory. - PowerPoint PPT Presentation

Transcript of Standardní knihovní funkce pro práci se soubory

A1PRG - Programování – Seminář

Ing. Michal Heczko heczko@fai.utb.cz

Standardní knihovní funkce pro práci se soubory 13

Verze 2009.01

Agenda

Standardní knihovní funkce pro práci se soubory

Typy souborů

Textové soubory Binární soubory

Textové soubory

Lze je otevřít běžným textovým editorem Organizovány po řádcích Každý řádek ukončen znakem \n

Binární soubory

Při otevření běžným textovým editorem nedávají smysluplnou informaci

V souboru uloženy binárně přímo číselné hodnoty

Výhody: pokud je nutné uložit číslo (např. u čísla 65000

je v textovém souboru uloženo 5 bytů, ale v binárním 2 – při použití datového typu short int)

Odpadá nutnost konverze mezi použitým datovým typem a textem

FILE

Struktura FILE – speciální datový typ pro práci se soubory.

Struktura definována v souboru stdio.h Obsahuje informace o otevřeném

souboru, ukazatel na aktuální pozici v souboru, režim otevření souboru (čtení, zápis, …)

Otevření souboru

Funkce fopen() Hlavičkový soubor: stdio.h Syntaxe:FILE * fopen ( const char * filename, const char * mode );

Parametry: filename … jméno souboru mode … režim otevření

souboru Návratová hodnota:

FILE … ukazatel na soubor

Otevření souboru

Režim otevření souboruTextový s.

Binární s.

Popis

r rb Otevření souboru pro čtení. Soubor musí existovat!

w wb Otevření souboru pro zápis. Pokud soubor existuje, je jeho obsah přemazán.

a ab Otevření souboru pro zápis. Pokud soubor existuje, jsou data přidána na konec souboru.

Otevření souboru

Režim otevření souboruTextový s.

Binární s.

Popis

r+ r+b Otevření souboru pro čtení a zápis. Soubor musí existovat!

w+ w+b Vytvoření a otevření souboru pro čtení a zápis. Pokud soubor existuje, je jeho obsah přemazán.

a+ a+b Otevření souboru pro čtení a přidávání dat. Pokud soubor neexistuje, je vytvořen. Přidávat data lze pouze na konec souboru.

Uzavření souboru

Funkce fclose() Hlavičkový soubor: stdio.h Syntaxe:int fclose ( FILE * stream );

Parametry: stream … ukazatel na soubor

Návratová hodnota: 0 při správném uzavření souboru, jinak EOF

Příklad otevření a uzavření souboruFILE *f;

f = fopen(″soubor.txt″,″r″);

if(f == NULL)

{

printf(″Soubor nebyl nalezen″);

}

else

{

// … čtení ze souboru …

fclose(f);

}

Formátované čtení dat

Funkce fscanf() Hlavičkový soubor: stdio.h Syntaxe:int fscanf ( FILE * stream, const char * format, ... );

Parametry: stream … ukazatel na soubor Další parametry stejné jako u scanf()

Návratová hodnota: Počet načtených položek nebo EOF při chybě

čtení

Formátovaný zápis dat

Funkce fprintf() Hlavičkový soubor: stdio.h Syntaxe:int fprintf ( FILE * stream, const char * format, ... );

Parametry: stream … ukazatel na soubor Další parametry stejné jako u printf()

Návratová hodnota: Počet zapsaných znaků nebo záporné číslo při

chybě zápisu

Příklad zápisu do souboru

FILE *f;

f = fopen(″soubor.txt″,″w″);

if(f == NULL)

{

printf(″Soubor nelze vytvořit″);

}

else

{

fprintf(f,″%d %f %s\n″, 5, 2.8, ″text″);

fclose(f);

}

Příklad čtení ze souboru

FILE *f;

f = fopen(″soubor.txt″,″r″);

int x = 1;

int n;

while (x != EOF)

{

x = fscanf(″%d\t″, &n);

printf(″%d\n″,n);

}

fclose(f);

Neformátované čtení datNeformátovaný zápis dat Funkce:

fgetc() … čtení jednoho znaku ze souboru fputc() … zápis jednoho znaku do souboru

Makra: getc() … čtení jednoho znaku ze souboru putc() … zápis jednoho znaku do souboru

Makra by měla zajistit mírně rychlejší načítání dat.

Neformátované čtení dat

Funkce fgetc() Hlavičkový soubor: stdio.h Syntaxe:int fgetc ( FILE * stream );

Parametry: stream … ukazatel na soubor

Návratová hodnota: Načtený znak ve formátu datového typu int

Neformátované čtení dat

Makro getc() Hlavičkový soubor: stdio.h Syntaxe:int getc ( FILE * stream );

Parametry: stream … ukazatel na soubor

Návratová hodnota: Načtený znak ve formátu datového typu int

Neformátovaný zápis dat

Funkce fputc() Hlavičkový soubor: stdio.h Syntaxe:int fputc (int character, FILE * stream );

Parametry: character … znak, který má být zapsán stream … ukazatel na soubor

Návratová hodnota: Stejný znak, který byl zapsán. V případě chyby EOF.

Neformátovaný zápis dat

Makro putc() Hlavičkový soubor: stdio.h Syntaxe:int putc (int character, FILE * stream );

Parametry: character … znak, který má být zapsán stream … ukazatel na soubor

Návratová hodnota: Stejný znak, který byl zapsán. V případě chyby EOF.

Příklad čtení ze souboru a zápisu do souboruFILE *f, *g;

int c;

f = fopen(″x.txt″,″r″);

g = fopen(″y.txt″,″w″);

while ((c = getc(f)) != EOF) {

putc(c, g);

}

fclose(f);

fclose(g);

Změna pozice v souboru

Funkce ftell()

Zjištění aktuální pozice v souboru fseek()

Přesun na určitou pozici v souboru rewind()

Přesun na začátek souboru

Zjištění aktuální pozice v souboru Funkce ftell()

Hlavičkový soubor: stdio.h Syntaxe:long int ftell ( FILE * stream );

Parametry: stream … ukazatel na soubor

Návratová hodnota: Pozice V případě chyby -1.

Nastavení pozice v souboru

Funkce fseek() Hlavičkový soubor: stdio.h Syntaxe:int fseek ( FILE * stream, long int offset, int origin );

Parametry: stream … ukazatel na soubor offset … počet znaků od daného

počátku origin … definice počátku pro parametr

offset. Návratová hodnota: 0, pokud vše proběhne v

pořádku

Nastavení pozice v souboru

Funkce fseek() Hlavičkový soubor: stdio.h Syntaxe:int fseek ( FILE * stream, long int offset, int origin );

Parametr origin: SEEK_SET … začátek souboru SEEK_CUR … aktuální pozice v souboru SEEK_END … konec souboru

Příklad

FILE *f;

long size;

f = fopen („s.txt","rb");

if (f == NULL) printf ("SOUBOR NELZE OTEVŘÍT");

else

{

fseek (f, 0, SEEK_END);

size=ftell (f);

fclose (f);

printf ("Velikost souboru s.txt: %ld B.\n",size);

}

Přesun na začátek souboru

Funkce rewind() Hlavičkový soubor: stdio.h Syntaxe:void rewind ( FILE * stream);

Parametry: stream … ukazatel na soubor

Alternativa:fseek ( stream , 0L , SEEK_SET );

Zpracování bloku dat

Funkce: fread() fwrite()

Načtení bloku dat

Funkce fread() Hlavičkový soubor: stdio.h Syntaxe:size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

Parametry: ptr … adresa paměti pro uložení

bloku dat size … rozměr jedné položky v

bytech count … počet položek stream … ukazatel na soubor

Načtení bloku dat

Funkce fread() Hlavičkový soubor: stdio.h Syntaxe:size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

Návratová hodnota: Počet úspěšně načtených položek

Načtení bloku dat

Funkce fwrite() Hlavičkový soubor: stdio.h Syntaxe:size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

Parametry: ptr … adresa paměti pro načtení

bloku dat size … rozměr jedné položky v

bytech count … počet položek stream … ukazatel na soubor

Načtení bloku dat

Funkce fwrite() Hlavičkový soubor: stdio.h Syntaxe:size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

Návratová hodnota: Počet úspěšně zapsaných položek

Bloky dat - příklad

FILE * f;

int pole[] = { 1, 2, 3, 4, 5, 6, 7, 8 };

f = fopen ( „data.bin" , "wb" );

fwrite (pole, sizeof(int) , 8 , f);

fclose (f);

A1PRG-s 13. Soubory

Děkuji za pozornost

Ing. Michal Heczko

heczko@fai.utb.cz

218/U3

Prezentace k dispozici na http://vyuka.fai.utb.cz