340 likes | 464 Views
Verze 2009.01. Standardní knihovní funkce pro práci se soubory. 13. A1PRG - Programování – Seminář Ing. Michal Heczko heczko@fai.utb.cz. Agenda. Standardní knihovní funkce pro práci se soubory. Typy souborů. Textové soubory Binární soubory. Textové soubory.
E N D
Verze 2009.01 Standardní knihovní funkce pro práci se soubory 13 A1PRG - Programování – Seminář Ing. Michal Heczko heczko@fai.utb.cz
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í souboru
Otevření souboru • Režim otevření 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í 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á 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 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 … 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