
//
// To jest przykładowy kod z podrozdziału 21.7.2 „Iteratory strumieni” książki
// "Programowanie. Teoria i praktyka z wykorzystaniem C++" Bjarne'a Stroustrupa.
//

#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>

using namespace std;

//------------------------------------------------------------------------------

void foo()
{
    ostream_iterator<string> oo(cout);        // Przypisanie do *oo jest równoważne z zapisem w cout.

    *oo = "Witaj, ";    // Oznacza cout << "Witaj, "
    ++oo;               // Przygotowanie do następnej operacji wyjściowej.
    *oo = "świecie!\n";   // Oznacza cout << "świecie!\n".

    istream_iterator<string> ii(cin); // reading *ii is to read a string from cin

    string s1 = *ii;    // Oznacza cin>>s1.
    ++ii;               // Przygotowanie na następną operację wejściową.
    string s2 = *ii;    // Oznacza cin>>s2.
}

//------------------------------------------------------------------------------

int main()
{
    string from, to;
    cin >> from >> to;  // Pobiera nazwy plików źródłowego i docelowego.

    ifstream is(from.c_str());            // Otwiera strumień wejściowy.
    ofstream os(to.c_str());              // Otwiera strumień wyjściowy.

    istream_iterator<string> ii(is);      // Tworzy iterator wejściowy dla strumienia.
    istream_iterator<string> eos;         // wartownik wejścia
    ostream_iterator<string> oo(os,"\n"); // Tworzy iterator wyjściowy dla strumienia.

    vector<string> b(ii,eos);             // b jest wektorem inicjowanym danymi wejściowymi.
    sort(b.begin() ,b.end());             // sortuje bufor
    copy(b.begin() ,b.end() ,oo);         // Kopiuje zawartość bufora na wyjście.

}

//------------------------------------------------------------------------------
