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

Dlaczego zmienna bool poprawnosc = cin.good() zawsze podaje wartość 1?

Ostatnio zmodyfikowano 2016-06-20 17:46
Autor Wiadomość
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:

C/C++
#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():

C/C++
#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;
}
P-149307
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.
P-149308
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.
C/C++
bool poprawnosc = false;
// wczytywanie
poprawnosc = std::cin.good(); // przechowanie stanu strumienia z tego miejsca


Jeśli rozumiesz użycie std::cin.good() bezpośrednio w kodzie,
to tak używaj.

P-149311
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
?
P-149312
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).
P-149313
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.
P-149320
« 1 »
  Strona 1 z 1