
//
// To jest przykładowy kod z podrozdziału 10.6 „Obsługa błędów wejścia i wyjścia” książki 
// "Programowanie. Teoria i praktyka z wykorzystaniem C++" Bjarne'a Stroustrupa.
//

#include "std_lib_facilities.h"

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

void fill_vector(istream& ist, vector<int>& v, char terminator)
// Wczytuje liczby całkowite ze strumienia ist do wektora v do chwili napotkania eof() lub znaku oznaczającego koniec danych.
{
    int i = 0;
    while (ist >> i) v.push_back(i);
    if (ist.eof()) return;    // Dobrze: znaleziono koniec pliku.

    if (ist.bad()) error("Strumień ist jest w stanie bad."); // Uszkodzony strumień — wynosimy się stąd!

    if (ist.fail()) {   // Uporządkowanie, co się da, i zgłoszenie problemu.
        ist.clear();    // Wyczyszczenie stanu strumienia,
                        // aby można było poszukać znaku kończącego.
        char c;
        ist>>c;         // Wczytanie znaku z nadzieją, że to znak kończący.
        if (c != terminator) { // Niespodziewany znak.
            ist.unget();       // Oddanie z powrotem tego znaku.
            ist.clear(ios_base::failbit); // Ustawienie stanu na fail().
        }
    }
}

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

int main()
try
{
    vector<int> v;
    fill_vector(cin, v, '*');
}
catch (exception& e) {
    cerr << "Błąd: " << e.what() << '\n'; 
    return 1;
}
catch (...) {
    cerr << "Nieznany wyjątek!\n"; 
    return 2;
}

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