8.4. Přímý přístup

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

V I/O systémech jazyka C++ přístup pomocí funkcí seekg() a seekp() s následujícími syntaxemi:
istream &seekg(off_type offset, seekdir origin);
ostream &seekp(off_type offset, seekdir origin);


off_type je typ integer definovaný ios, který je schopen pojmout největší platnou hodnotu, kterou může offset mít. Argument seekdir je jedna z následujících hodnot:

upozornění
  • ios::beg - hledání od začátku
  • ios::cur - hledání od současné pozice
  • ios::end - hledání od konce

I/O systém jazyka C++ používá dva typy ukazatelů.
  1. get ukazatel - který ukazuje, kde v souboru dojde k další výstupní operaci
  2. put ukazatel - který ukazuje, kde v souboru dojde k další vstupní operaci

Obecně platí, že soubory, k nimž přistupujeme pomocí seekg() a seekp(), by měly být otevřeny pro binární operace.

Existují i přetížené verze funkcí seekg() a seekp(), které přesunují ukazatel na pozici vrácenou funkcemi tellg() a tellp(). Funkce tellg() a tellp() nám vrací aktuální hodnotu pozice daného ukazatele.
istream &seekg(pos_type position);
ostream &seekp(pos_type position);


pos_type je integer typ definovaný v ios, který je schopen uložit největší hodnotu, která definuje pozici v sobouru.
pos_type tellg();
pos_type tellp();


Následující program používá seekg() k nastavení ukazatele doprostřed souboru a pro zobrazení jeho obsahu. Jméno souboru a pozice jsou zadávány jako argumenty příkazového řádku.

src/8_4.cpp
Příklad 8.4.
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>

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

  if(argc!=3) {
    cout << "Zadejte: 8_4 nazev_souboru pozice\n";
    return 1;
  }

  ifstream in(argv[1], ios::in | ios::binary);

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

  in.seekg(atoi(argv[2]), ios::beg);

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

  in.close();

  return 0;
}