****** 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.