****** Sbírka_úloh_z_jazyka_C ****** [UP Logo] Katedra informatiky Univerzity Palackého v_Olomouci ****** Práce s binárními soubory ****** * Jednotkové_vektory * Databáze_osob ***** Doplňující informace ***** Veškeré níže uvedené funkce je možné použít také s textovými soubory, mnohem častěji se však v praxi využívají u souborů binárních. Čtení bloku dat Hlavička funkce: size_t fread(void *kam, size_t rozmer, size_t pocet, FILE *fr); kde fr je datový proud, ze kterého se čte, rozmer je velikost jedné čtené položky, pocet udává počet položek a kam je adresa, kam se úspěšně přečtená data uloží. Funkce vrací počet úspěšně přečtených položek. Příklad: #define VELIKOST_BLOKU 10 ... int data[VELIKOST_BLOKU]; FILE *fr = fopen("in.dat", "rb"); fread(data, sizeof(int), VELIKOST_BLOKU, fr); Zápis bloku dat Hlavička funkce: size_t fwrite(void *odkud, size_t rozmer, size_t pocet, FILE *fw); kde fw je datový proud, do kterého se zapisuje, rozmer je velikost jedné zapisované položky, pocet udává počet položek a odkud je adresa, kde jsou zapisovaná data uložena. Funkce vrací počet úspěšně zapsaných položek. Příklad: #define VELIKOST_BLOKU 10 ... int data[VELIKOST_BLOKU]; FILE *fw = fopen("out.dat", "wb"); ... fwrite(data, sizeof(int), VELIKOST_BLOKU, fw); Posun pozice v souboru V některých situacích je třeba číst (resp. zapisovat) data z (resp. do) konkrétního místa souboru. Toto nám jazyk C umožňuje řešit pomocí posouvání "ukazatele" na aktuálně zpracovávanou pozici daného souboru. Hlavička funkce pro posun v souboru: int fseek(FILE *f, long posun, int odkud); kde f je daný soubor, posun udává počet bytů (může být i záporné číslo), o kolik se chceme posunout směrem ke konci souboru, odkud udává pozici v souboru, ke které se bude zamýšlený posun vztahovat. Parametr odkud může nabývat těchto hodnot: SEEK_SET (pro posun od začátku souboru), SEEK_CUR (pro posun od aktuální pozice) a SEEK_END (posun od konce souboru). Funkce vrací nulu v případě úspěchu a nenulovou hodnotu, pokud nastala chyba. Hlavička funce pro zjištění pozice: long ftell(FILE *f); kde f je daný soubor. Funkce vrací aktuální pozici odpovídající velikosti posunu od začátku souboru v bytech. Příklad: /* navrat na puvodni misto */ akt_pos = ftell(f); fseek(f, 0L, SEEK_SET); if (hledej(f, "ahoj") == NULL) fseek(f, akt_pos, SEEK_SET); Pokud v programu zapisujeme a čteme z téhož souboru, je potřeba si uvědomit, že z technických důvodů nesmí žádná vstupní operace (např. volání fread) následovat přímo po výstupní operaci (např. volání fwrite) a naopak, bez předchozího volání funkce fseek. Pokud není potřeba měnit pozici v souboru, lze pomocí funkce realizovat posun o 0 bytů (např. fseek(f, 0L, SEEK_CUR);). =============================================================================== [Creative_Commons_License] Sbírka_úloh_z_jazyka_C. © Katedra_informatiky Univerzity_Palackého_v_Olomouci, 2009. Projekt byl vytvořen za podpory grantu FRVŠ 2061/2009/G1.