Pobierając cin'em dane jakiegokolwiek typu zostaną one zapisane do zmiennej tylko wtedy, gdy jej typ i typ danych są takie same lub istnieje między nimi możliwość niejawnej konwersji. Przykładowo wczytując liczbę 3.14 do zmiennej typu int zostanie ona pomyślnie wczytana bo zajdzie konwersja z jednego typu liczbowego na drugi. W innym przypadku, gdy dane wejściowe nie będą pasować do typu zmiennej do której mają być przypisane strumień cin zwróci błąd. O tym czy dane zostały poprawnie wczytane informuje funkcja cin.fail() lub samo wyrażenie cin >> zmienna.
Przykład:
int a;
cin >> a;
if(cin.fail())
{
// Ten kod wykona się jeśli podane w strumieniu cin
// dane nie będą formatem liczbowym
cout << "Bledne dane wejsciowe" << endl;
}
else
{
cout << "Podana liczba: " << a << endl;
}
Zawsze, gdy dane wejściowe zostaną poprawnie odczytane strumień cin jest czyszczony. Jeśli jednak dane są niepoprawne, nie są one usuwane a zostają dalej w strumieniu. Dlatego żeby dalej móc poprawnie używać strumienia cin nalezy go wyczyścić. W tym celu należy użyć dwóch funkcji:
cin.clear() - Jej użycie spowoduje zresetowanie stanu obiektu cin, tak żeby był zdatny do użytku. Jeśli po błędnym wczytaniu danych status strumienia nie zostanie zresetowany, dalej będzie on zwracał cin.fail() w dalszym działaniu programu tym samym uniemożliwiając odczytanie kolejnych zmiennych.
cin.ignore() - Ta funkcja służy temu, by zignorować błędne dane wejściowe znajdujące się w strumieniu. Ignorując te dane trzeba uwzględnić ich rozmiar oraz znak na którym ignorowanie ma się zatrzymać. Wywołując funkcję cin.ignore(3, 'a') ignorowane są 3 znaki na początku strumienia, chyba że zostanie napotkany znak 'a'. Wtedy ignorowanie kolejnych znaków jest przerywane. W przypadku błędnych danych wejściowych należy zignorować cały strumień, lub wszystko, aż do napotkania znaku nowej linii ('\n'). Aby tego dokonaćnależy wywołać funkcję cin.ignore(numeric_limits<streamsize>::max(), '\n') uprzednio załączając bibliotekę <numeric> do programu.
Przykład 2: z zastosowaniem cin.clear i cin.ignore
int a, b;
cin >> a;
if(cin.fail())
{
// Ten kod wykona się jeśli podane w strumieniu cin
// dane nie będą formatem liczbowym
cout << "Bledne dane wejsciowe" << endl;
// Resetowanie stanu obiektu cin, żeby był on później
// zdatny do użytku
cin.clear();
}
else
{
cout << "Podana liczba: " << a << endl;
}
// Ignorowanie niepoprawnych danych wejściowych
cin.ignore(std::numeric_limits<streamsize>::max(), '\n');
if(cin>>b) cout << "Poprawne dane wejsciowe" << endl;
else cout << "Bledne dane wejsciowe" << endl;