//: C04:Seeking.cpp
// Z knihy "Myslíme v jazyce C++, část 2" od Bruce Eckela a Chucka Allisona.
// (c) 1995-2004 MindView, Inc. Všechna práva vyhrazena.
// Přečtěte si podmínky používání zdrojových kódů umístěné v souboru 
// 'Licence.txt' dodávaném spolu s balíčkem kódu dostupným na www.MindView.net.
// hledání ve vstupních/výstupních proudech.
#include <cassert>
#include <cstddef>
#include <cstring>
#include <fstream>
#include "../require.h"
using namespace std;

int main() {
  const int STR_NUM = 5, STR_LEN = 30;
  char origData[STR_NUM][STR_LEN] = {
    "Generál Laudon jede skrz...",
    "Kdo tam?",
    "Programátor!",
    "V čem programuje?",
    "V C++!"
  };
  char readData[STR_NUM][STR_LEN] = {{ 0 }};
  ofstream out("Basnicka.bin", ios::out | ios::binary);
  assure(out, "Basnicka.bin");
  for(int i = 0; i < STR_NUM; i++)
    out.write(origData[i], STR_LEN);
  out.close();
  ifstream in("Basnicka.bin", ios::in | ios::binary);
  assure(in, "Basnicka.bin");
  in.read(readData[0], STR_LEN);
  assert(strcmp(readData[0], "Generál Laudon jede skrz...")
    == 0);
  // najdi -STR_LEN bytů od konce souboru
  in.seekg(-STR_LEN, ios::end);
  in.read(readData[1], STR_LEN);
  assert(strcmp(readData[1], "V C++!")
    == 0);
  // hledání absolutní pozice (jako použitím oiperátoru [] se souborem)
  in.seekg(3 * STR_LEN);
  in.read(readData[2], STR_LEN);
  assert(strcmp(readData[2], "V čem programuje?") == 0);
  // zpětné hledání od aktuální pozice
  in.seekg(-STR_LEN * 2, ios::cur);
  in.read(readData[3], STR_LEN);
  assert(strcmp(readData[3], "Programátor!") == 0);
  // Hledání od začátku souboru
  in.seekg(1 * STR_LEN, ios::beg);
  in.read(readData[4], STR_LEN);
  assert(strcmp(readData[4], "Kdo tam?")
    == 0);
} ///:~
