8.2. Soubory

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

Pro práci se souborem musíme do svého programu vložit hlavičkový soubor fstream.h. Zde je definováno několik tříd včetně ifstream, ofstream a fstream. Tyto třídy jsou odvozeny od istream a ostream.

V jazyce C++ otevřeme soubor připojením k datovému proudu. Existují 3 typy proudů:
  1. Vstupní
  2. Výstupní
  3. Vstupně-Výstupní

Než můžeme soubor otevřít musíme získat proud. Pro vytvoření vstupního proudu deklarujeme objekt typu ifstream. Pro vytvoření výstupního proudu deklarujeme objekt typu ofstream. Pro vytvoření vstupně-výstupního proudu deklarujeme objekt typu fstream.

Jednoduchý příklad
Příklad:
ifstream vstup;
ofstream vystup;
fstream vstupvystup;


Výše uvedenou deklarací jsme deklarovali jeden vstupní, jeden výstupní a jeden vstupně-výstupní proud. Poté co jsme vytvořili proud, je jeden ze způsobů jeho přidružení k souboru příkaz open(). Viz následující syntaxe:

upozornění
void ifstream::open(const char *jméno-souboru,
                    openmode mód=ios::in);
void ofstream::open(const char *jméno-souboru,
                    openmode mód=ios::out | ios::trunc);
void fstream::open(const char *jméno-souboru,
                    openmode mód=ios::in | ios::out);


Jméno-souboru může zahrnovat také specifikaci cesty k souboru. Hodnota mód určuje jak je soubor otevřen. Musí to být hodnota typu openmode která může být jedna z následujících:
  • ios::app - všechny výstupy do souboru se připojují na konec
  • ios::ate - při otevření souboru se hledá jeho konec, ale I/O operace může začít kdekoliv v souboru
  • ios::binary - soubor otevřen v binárním módu
  • ios::in - soubor je určen pro vstup
  • ios::out - soubor je určen pro výstup
  • ios::trunc - obsah souboru bude oříznut na nulovou délku

Standardně jsou všechny soubory otevírány jako textové. Když vytváříme výstupní soubor pomocí ofstream pak je automaticky oříznut na nulovou délku.

Jestliže funkce open() selže, pak bude proud v booleovském výrazu vyhodnocen jako false. Proto bychom se vždy měli přesvědčit, zda k otevření proudu opravdu došlo!

Také bychom si měli ověřovat, zda došlo k úspěšnému otevření souboru a to pomocí funkce is_open(), která je členem fstream, ifstream a ofstream. Má následující syntaxi:
bool is_open();


Je-li proud připojen k otevřenému souboru pak vrací true, jinak vrací false.

Pro uzavření souboru použijeme členskou funkci close(). Tato funkce nepřebírá žádné argumenty, ani nevrací žádnou hodnotu.

Pomocí funkce eof() si ověřujeme, zda byl dosažen konec souboru. Tato funkce má následující syntaxi:
bool eof();


Pokud je dosažen konec souboru vrací true, v opačném případě vrací false.

Pokud byl již soubor otevřen můžeme začít číst data, nebo data zapisovat. Stejně jako při práci s obrazovkou budeme používat operátory << a >>.

Probranou teorii si ověříme na příkladu. Naším úkolem je vytvořit soubor, zapsat do něj informace a tyto informace opět přečíst.

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

int main()
{
  ofstream fout("test");  // vytvareni souboru pro zapis

  if(!fout) {
    cout << "Nemohu otevrit soubor pro zapis\n";
    return 1;
  }

  fout << "Test\n";
  fout << 100 << ' ' << hex << 100 << endl;

  fout.close();

  ifstream fin("test"); // otevreni souboru pro cteni

  if(!fin) {
    cout << "Nemohu otevrit soubor pro cteni\n";
    return 1;
  }

  char str[80];
  int i;

  fin >> str >> i;
  cout << str << ' ' << i << endl;

  fin.close();

  return 0;
}