Dlaczego zmienna bool poprawnosc = cin.good() zawsze podaje wartość 1?
Ostatnio zmodyfikowano 2016-06-20 17:46
szymon170 Temat założony przez niniejszego użytkownika |
Dlaczego zmienna bool poprawnosc = cin.good() zawsze podaje wartość 1? » 2016-06-20 16:34:34 Witam. Postanowiłem zrobić pracę domową z lekcji z poziomu 1, rozdziału 9 - Obsługa strumienia wejściowego. Mam już gotowy kod, tylko mam z nim mały problem. Mam problem ze zmienną bool, która podaje czy wczytywanie danych się udało. Zawsze podaje wartość 1, czyli że się udało. Nawet jak wpiszę jakieś przypadkowe znaki to i tak wyskoczy mi 1 (mimo że wprowadzam dane do zmiennej float). Zanim zaczniecie pisać że odrabianie za mnie prac domowych nie jest zgodne z regulaminem to chcę wam powiedzieć że ta praca jest praktycznie skończona tylko mam błąd z tą zmienną. Jak jej nie użyję i użyję czystego cin.good() to wszystko jest w porządku. Oto mój kod: #include <iostream> #include <limits> using namespace std;
int main() { cout << endl; cout << "=========================" << endl; cout << "= Nauka C++ - ćwiczenia =" << endl; cout << "=========================" << endl << endl << endl; float liczba1; float liczba2; float liczba3; bool poprawnosc = cin.good(); cout << "Proszę, podaj 3 liczby rzeczywiste." << endl; cout << "Pierwsza liczba: "; cin >> liczba1; cout << "Twoja pierwsza liczba to: " << liczba1 << ". Wczytano? " << poprawnosc << endl; cin.clear(); std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); cout << "Druga liczba: "; cin >> liczba2; cout << "Twoja druga liczba to: " << liczba2 << ". Wczytano? " << poprawnosc << endl; cin.clear(); std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); cout << "Trzecia liczba: "; cin >> liczba3; cout << "Twoja trzecia liczba to: " << liczba3 << ". Wczytano? " << poprawnosc << endl; return 0; }
Najdziwniejsze jest to, że jeśli nie będę używał bool, tylko czystego cin.good() to wyniki będą poprawne (czyli jak coś źle podam wyskoczy mi 0). Nie mam błędów w kompilacji. Kod z czystym cin.good(): #include <iostream> #include <limits> using namespace std;
int main() { cout << endl; cout << "=========================" << endl; cout << "= Nauka C++ - ćwiczenia =" << endl; cout << "=========================" << endl << endl << endl; float liczba1; float liczba2; float liczba3; cout << "Proszę, podaj 3 liczby rzeczywiste." << endl; cout << "Pierwsza liczba: "; cin >> liczba1; cout << "Twoja pierwsza liczba to: " << liczba1 << ". Wczytano? " << cin.good() << endl; cin.clear(); std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); cout << "Druga liczba: "; cin >> liczba2; cout << "Twoja druga liczba to: " << liczba2 << ". Wczytano? " << cin.good() << endl; cin.clear(); std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' ); cout << "Trzecia liczba: "; cin >> liczba3; cout << "Twoja trzecia liczba to: " << liczba3 << ". Wczytano? " << cin.good() << endl; return 0; }
|
|
michal11 |
» 2016-06-20 16:44:23 Dlaczego wywołują tą funkcję tylko raz i to w ogóle przed użyciem cin. Nic dziwnego, że wtedy zwraca ci true. |
|
carlosmay |
» 2016-06-20 16:47:39 Nie aktualizujesz zmiennej poprawnosc po każdym wczytywaniu, tylko inicjalizujesz na samym początku i używasz jednej i tej samej wartości. bool poprawnosc = false;
poprawnosc = std::cin.good();
Jeśli rozumiesz użycie std::cin.good() bezpośrednio w kodzie, to tak używaj. |
|
szymon170 Temat założony przez niniejszego użytkownika |
» 2016-06-20 16:51:21 Żeby ją zaktualizować należy po każdym wczytaniu napisać w kodzie poprawnosc = cin.good ? |
|
szymon170 Temat założony przez niniejszego użytkownika |
» 2016-06-20 16:54:27 Dobrze myślałem. Jak napiszę po każdym wczytaniu taką linijkę to to działa. Jednak jest to niewygodne w użyciu. Dziękuję za wasze odpowiedzi.
A, i jeszcze jedno - na początku nie myślałem o tym żeby to aktualizować bo myślałem że to się samo zaktualizuje - bo cin.good() nie ma określonej wartości i dostosowuje się do sytuacji (jak coś dobrze wpiszemy pokaże nam 1, a jak nie to 0). |
|
carlosmay |
» 2016-06-20 17:46:50 cin.good() domyślnie ma ustawioną flagę na true . Flaga ta zmienia swoją wartość zależnie od powodzenia wczytywania. Jeśli chodzi o zmienną, nie ma znaczenia jaki ma typ, przechowuje wartość. Raz zainicjalizowana , będzie przechowywać tą wartość do następnego przypisania lub końca swojego zasięgu. Typ bool nie jest tu żadnym wyjątkiem. |
|
« 1 » |