Standardní knihovní funkce pro práci se soubory
Download
Report
Transcript Standardní knihovní funkce pro práci se soubory
Verze 2009.01
13
Standardní knihovní funkce pro práci se soubory
A1PRG - Programování – Seminář
Ing. Michal Heczko [email protected]
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
mode
Návratová
FILE
…
…
jméno souboru
režim otevření souboru
hodnota:
…
ukazatel na soubor
Otevření souboru
Režim otevření souboru
Textový 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í souboru
Textový 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
Návratová
0
…
ukazatel na soubor
hodnota:
při správném uzavření souboru, jinak EOF
Příklad otevření a uzavření souboru
FILE *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á
Počet
hodnota:
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á
Počet
hodnota:
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í dat
Neformátovaný zápis dat
Funkce:
fgetc()
fputc()
Makra:
getc()
putc()
… čtení jednoho znaku ze souboru
… zápis jednoho znaku do souboru
… čtení jednoho znaku ze souboru
… 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
…
Návratová
Načtený
ukazatel na soubor
hodnota:
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
…
Návratová
Načtený
ukazatel na soubor
hodnota:
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
stream
Návratová
Stejný
…
…
znak, který má být zapsán
ukazatel na soubor
hodnota:
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
stream
Návratová
Stejný
…
…
znak, který má být zapsán
ukazatel na soubor
hodnota:
znak, který byl zapsán.
V případě chyby EOF.
Příklad čtení ze souboru a zápisu do
souboru
FILE *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
Návratová
…
hodnota:
Pozice
V
případě chyby -1.
ukazatel na soubor
Nastavení pozice v souboru
Funkce fseek()
Hlavičkový
soubor:
stdio.h
Syntaxe:
int fseek ( FILE * stream, long int offset, int
origin );
Parametry:
stream
offset
origin
Návratová
…
…
…
ukazatel na soubor
počet znaků od daného počátku
definice počátku pro parametr
offset.
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
SEEK_CUR
SEEK_END
…
…
…
začátek souboru
aktuální pozice v souboru
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
…
size
…
…
…
count
stream
adresa paměti pro uložení bloku
dat
rozměr jedné položky v bytech
počet položek
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
…
size
…
…
…
count
stream
adresa paměti pro načtení bloku
dat
rozměr jedné položky v bytech
počet položek
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
[email protected]
218/U3
Prezentace k dispozici na http://vyuka.fai.utb.cz