headerphoto

Binární soubor

Údaje, uložené v binárním souboru, můžeme prohlížet, vytvářet a opravovat na rozdíl od textového souboru jen použitím odpovídajících funkcí v programu v jazyce C. Nemůžeme použít textový editor, tam jsou data nečitelná. Binární soubor má ale řadu výhod, pro které se v programování často používá. Výhodou je jejich menší velikost a rychlejší zpracování. Používají se především pro ukládání rozměrných dat - pole, struktura ... Při práci s daty funkce pracují s blokem dat o uvedené velikosti.

Pro čtení dat z binárního souboru se používá funkce fread() a pro zápis funkce fwrite(). Obě mají čtyři parametry. Prvním parametrem je adresa proměnné, kam se bude ukládat příp. odkud se bude brát blok dat. Protože se vyžaduje adresa proměnné, můžeme vhodně použít operátor &. Druhý parametr určuje velikost položky v Bytech (je výhodné použít operátor sizeof()). Třetí parametr určuje počet položek určené velikosti, které se budou zpracovávat. Posledním parametrem je proměnná typu FILE*. Soubor musí být otevřen v režimu zpracování pro binární soubory ("rb", "wb", ...). Návratová hodnota u obou funkcí je počet úspěšně přečtených položek.

fwrite(&x, sizeof(Tdata), 1, f);

- příkaz uloží z adresy proměnné x jeden blok paměti o velikosti určené operátorem sizeof() do souboru f. Uloží tedy do souboru jednu strukturu. Jako parametr pro sizeof() je vhodné použít datový typ proměnné, jejíž obsah ukládáme.

fread(&x, sizeof(Tdata), 1, f);

- příkaz načte ze souboru f jednu položku o velikosti určené operátorem sizeof() a uloží ji na adresu proměnné x.

Funkce, která uloží aktuální počet záznamů (reprezentovaných strukturou typu TZAZNAM) z pole do binárního souboru.

int do_soub(TZAZNAM p[], int pocet)    
{
  FILE *f;
  int i;
  if((f=fopen("udaje.dat","wb"))==NULL)
  {  
	//printf("\nSoubor se nepovedlo otevrit\n");
	return -1;
  }
  for(i=0; i<pocet; i++) 
  {
        fwrite(&p[i], sizeof(TZAZNAM), 1, f);
  }
  if (fclose(f)==EOF) 
  { 
        //printf("Soubor se nepodarilo zavrit"); 
        return -1; 
  }
  return 0;
}

Poznámka: Hodnoty z pole můžeme uložit do souboru tak, že procházíme celé pole (smyčka) a ukládáme tak postupně po prvcích. To je uvedeno v předchozím příkladě. Je ale i další možnost, a to uložit celé pole najednou. To lze provést následujícím příkazem:

fwrite(p, sizeof(TZAZNAM), pocet, f);

Funkce, která načte z binárního souboru udaje.dat záznamy (reprezentovaných strukturou typu TZAZNAM) do pole.

int ze_soub(TZAZNAM p[])  //    cteni ze souboru
{
  FILE *f;
  TZAZNAM x;
  int i = 0, pocet = 0;
  if((f = fopen("udaje.dat","rb")) == NULL)
	{
	  //printf("\nSoubor se nepovedlo otevrit\n");
	  return -1;
	 }

   while( fread(&x, sizeof(TZAZNAM), 1, f) == 1) 
        { 
          p[i]=x;
          i++;
          pocet++;
         }
  
  fclose(f);
  return pocet;
 }

Další příkazy

V textových souborech se příliš nevyužívá možnost pohybu v souboru, údaje se čtou sekvenčně. V binárních souborech přesně známe velikost jednotlivých uložených položek, proto je někdy výhodné posunout vnitřní ukazatel v souboru. K tomu se používá funkce fseek(), má tři parametry. První parametr je proměnná typu FILE*. Druhý parametr udává počet Bytů, o které se v souboru chceme posunout. Třetí parametr udává místo, odkud se budeme v souboru posouvat. Může mít hodnotu SEEK_SET (od začátku souboru), SEEK_CUR (od aktuální pozice) nebo SEEK_END (od konce souboru). Funkce vrátí nulu v případě úspěšného přesunu nebo nenulovou hodnotu v případě neúspěchu.

V binárním souboru je možné použít funkci ftell(), která vrátí posunutí v Bytech od začátku souboru po aktuální pozici.

Pro testování konce binárního souboru je možno taky použít standardní makro feof(). Makro vrací nulu, pokud není konec a nenulovou hodnotu v případě, že poslední čtení bylo za koncem souboru.

Design downloaded from Free Templates - your source for free web templates