Post on 08-Jan-2016
description
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