
//
// To jest przykładowy kod z podrozdziału 10.10 „Standardowa pętla wejściowa” książki 
// "Programowanie. Teoria i praktyka z wykorzystaniem C++" Bjarne'a Stroustrupa.
//

#include "std_lib_facilities.h"

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

typedef int My_type;

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

void input_loop_1(istream& ist)
{  
    My_type var;
    while (ist>>var) {    // Wczytuje dane do końca pliku.
        // Może jakiś test poprawności var.
        // Jakieś operacje przy użyciu var.
    }
    // Rzadko da się odzyskać sprawność po wystąpieniu stanu bad. Nie należy tego próbować, jeśli nie jest to konieczne:
    if (ist.bad()) error("Nieprawidłowy strumień wejściowy.");
    if (ist.fail()) {
        // Czy to był akceptowalny znak końcowy?
    }
    // Kontynuacja: znaleziono koniec pliku.
}

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

void input_loop_2(istream& ist)
{  
    My_type var;
    while (ist>>var) {    // Wczytuje dane do końca pliku.
        // Może jakiś test poprawności var.
        // Jakieś operacje przy użyciu var.
    }
    if (ist.fail()) { // Znak '|' pełni rolę symbolu końca i/lub separatora.
        ist.clear();
        char ch;
        if (!(ist>>ch && ch=='|')) error("Niepoprawny znak końca danych.");
    }
    // Kontynuacja: znaleziono koniec pliku lub znak końcowy.
}

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

void end_of_loop(istream& ist, char term, const string& message)
{
    if (ist.fail()) { // Użycie term jako znaku końca i/lub znaku oddzielającego.
        ist.clear();
        char ch;
        if (ist>>ch && ch==term) return;    // Wszystko jest w porządku.
        error(message);
    }
}

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

void input_loop_3(istream& ist)
{  
    My_type var;
    while (ist>>var) {    // Wczytuje dane do końca pliku.
        // Może jakiś test poprawności var.
        // Jakieś operacje przy użyciu var.
    }
    end_of_loop(ist,'|',"Niepoprawne zakończenie pliku");    // Test określający, czy można kontynuować.
    // Kontynuacja: znaleziono koniec pliku lub znak końcowy.
}

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

int main()
try
{
    input_loop_3(cin);
    input_loop_2(cin);
    input_loop_1(cin);
    // Gdzieś w kodzie: ist zgłasza wyjątek, jeśli coś się nie uda:
    cin.exceptions(cin.exceptions()|ios_base::badbit);
}
catch (exception& e) {
    cerr << "Błąd: " << e.what() << '\n'; 
    return 1;
}
catch (...) {
    cerr << "Nieznany wyjątek!\n"; 
    return 2;
}

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