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