8.3. Binární soubory

Časová náročnost
Časová náročnost: 15 minut

I/O funkce nejnižší úrovně jsou get() a put(). Funkce get() čte byt a funkce put() byt zapisuje. Nejpoužívanější syntaxe jsou uvedeny zde:
istream &get(char &ch);
ostraam &put(char ch);


Funkce get() čte jednotlivé znaky z proudu a vkládá je do ch. Funkce put() zapisuje ch do proudu a vrací odkaz na proud.

Pro čtení nebo zápis bloku dat do proudu se použijí funkce read() nebo write() s následující syntaxí:
istream &read(char *buf, streamsize počet);
ostream &write(const char *buf, streamsize počet);


Funkce read() čte daný počet bytů z vyvolaného proudu a vkládá je do vyrovnávací paměti (bufferu) odkazovaného přes buf. Funkce write() zapisuje daný počet bytů z vyrovnávací paměti odkazované přes buf do proudu. Typ streamsize je forma integer. Objekt typu streamsize je schopen pojmout největší počet bytů předávaných v jakékoliv I/O operaci.

Jestliže bylo dosaženo konce před tím, než byl přečten daný počet znaků, pak prostě funkce read() přestane číst a ve vyrovnávací paměti bude tolik znaků, kolik bylo přečteno. K tomu, abychom zjistili kolik znaků bylo přečteno můžeme použít funkci gcount().
streamsize gcount();


V následujícím příkladu si ukážeme jak vytvářet jednoduchý binární soubor a zapisovat do něj data. Název souboru je zadán jako argument příkazové řády.

src/8_2.cpp
Příklad 8.2.
#include <iostream.h> 
#include <fstream.h>

int main(int argc, char *argv[])
{
  char ch;

  if(argc!=2) {
    cout << "Zadejte: 8_2 nazev souboru\n";
    return 1;
  }

  ofstream out(argv[1], ios::out | ios::binary);

  if(!out) {
    cout << "Nelze otevrit soubor\n";
    return 1;
  }

  cout << "Pro ukonceni zadejte $\n";
  do {
	 cin.get(ch);
    out.put(ch);
  } while (ch!='$');

  out.close();

  return 0;
}




Následující program vypíše obsah souboru.

src/8_3.cpp
Příklad 8.3.
#include <iostream.h>
#include <fstream.h>

int main(int argc, char *argv[])
{
  char ch;

  if(argc!=2) {
    cout << "Zadejte: 8_3 nazev souboru\n";
    return 1;
  }

  ifstream in(argv[1], ios::in | ios::binary);
  if(!in) {
    cout << "Nelze otevrit soubor\n";
    return 1;
  }

  while(!in.eof()) {
    in.get(ch);
    cout << ch;
  }

  in.close();

  return 0;
}


Mimo výše uvedených formátů funkcí get() a put() je možné i tyto funkce přetížit a to následujícím způsobem:
istream &get(char *buf, streamsize počet);
istream &get(char *buf, streamsize počte, char oddělovač);
int get();


První formát načítá do pole znaky dle ukazatele buf, pokud není přetečen buď počtem znaků počet-1, nebo se nenarazí na konec řádku, nebo na konec souboru. Jestliže se ve vstupním proudu objeví znak nového řádku není přijat. Zůstává v proudu až do další vstupní operace.

Druhý formát čte znaky z pole dle ukazatele buf, pokud není přečten počet znaků počet-1, nebo se nenarazí na znak určený oddělovačem nebo se nenarazí na konec souboru.Jestliže se ve vstupním proudu objeví znak oddělovače není přijat. Zůstává v proudu až do další vstupní operace.

Třetí formát vrací vždy následující znak z proudu. Při dosažení konce vrací EOF.