Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z cin.good() i cin.fail().

Ostatnio zmodyfikowano 2016-11-16 17:18
Autor Wiadomość
Dejmon
Temat założony przez niniejszego użytkownika
Problem z cin.good() i cin.fail().
» 2016-11-15 22:40:07
Witam.
Uczę się języka C++ od około miesiąca. Aktualnie jestem na lekcji 17 kursu C++, lecz nadal nie udało mi się zrozumieć jednej rzeczy. Próbowałem zabezpieczyć kod programu przed wprowadzeniem niewłaściwych danych, ale nie ważne co poda użytkownik, program leci dalej zupełnie ignorując pętlę do...while. Program prezentuje się tak:
C/C++
#include <iostream>
using namespace std;

int wczytajLiczbe()
{
    int a;
    bool sukces;
   
    do
    {
        cin >> a;
       
        cin.clear();
        cin.sync();
       
        sukces = cin.good();
       
    } while( sukces != true );
   
    return a;
}

int main()
{
    cout << "Podaj liczbe: ";
    int liczba = wczytajLiczbe();
    cout << "Podales liczbe: " << liczba << endl;
    return 0;
}
Proszę o pomoc.
P-153763
carlosmay
» 2016-11-15 23:01:11
C/C++
cin >> a;

cin.clear();
cin.sync();

sukces = cin.good();
Niewłaściwa kolejność. Wczytaj liczbę, sprawdź stan strumienia i dopiero go czyść.
P-153765
Dejmon
Temat założony przez niniejszego użytkownika
» 2016-11-15 23:49:42
Dziękuję za pomoc, ale nie rozwiązało to mojego problemu. Program działa tak samo jak przedtem.
P-153767
carlosmay
» 2016-11-16 05:20:41
Pokaż kod.
P-153776
Dejmon
Temat założony przez niniejszego użytkownika
» 2016-11-16 16:06:52
Kod aktualnie wygląda tak:

C/C++
#include <iostream>
using namespace std;

int wczytajLiczbe()
{
    int a;
    bool sukces;
   
    do
    {
        cin.clear();
        cin.sync();
       
        cin >> a;
       
        sukces = cin.good();
       
    } while( sukces != true );
   
    return a;
}

int main()
{
    cout << "Podaj liczbe: ";
    int liczba = wczytajLiczbe();
    cout << "Podales liczbe: " << liczba << endl;
    return 0;
}
P-153780
karambaHZP
» 2016-11-16 16:27:54
nie rozwiązało to mojego problemu. Program działa tak samo jak przedtem.
A przebudowałeś projekt? Jeśli nie to uruchamiasz starą kompilację.
P-153781
michal11
» 2016-11-16 16:30:57
Wczytaj liczbę, sprawdź stan strumienia i dopiero go czyść.

a u ciebie jest czyść strumień, wczytaj liczbę, sprawdź stan strumienia.
P-153782
Dejmon
Temat założony przez niniejszego użytkownika
» 2016-11-16 17:18:06
Dzięki wszystkim za pomoc.
W prawdzie osiągnąłem to co chciałem, poprawiłem niektóre rzeczy i program działa prawie prawidłowo, ale nadal nie rozumiem dlaczego cin.good() przepuszcza liczby z przecinkami dla typu danych int.

Kod wygląda teraz tak:

C/C++
#include <iostream>
using namespace std;

int wczytajLiczbe()
{
    float a;
    bool sukces;
   
    do
    {
        cout << "Podaj liczbe: ";
       
        cin >> a;
       
        sukces = cin.good();
       
        cin.clear();
        cin.sync();
       
    } while( sukces != true );
   
    return a;
}

int main()
{
    float liczba = wczytajLiczbe();
    cout << "Podales liczbe: " << liczba << endl;
   
    return 0;
}
P-153783
« 1 »
  Strona 1 z 1