Strumień wejściowy - cin.good, cin.fail, cin.sync, cin.clear o co chodzi?!

0

Witam, otóż czytając kurs z strony : http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Obsluga-strumienia-wejsciowego/12 doszedłem do metod strumienia cin jakimi są cin.good, cin.fail, cin.sync i cin.clear . Otóż nie mogę sobie jakoś za bardzo przyswoić w którym momencie tego używać, do czego to służy i w ogóle co to robi... Niby coś tam w kursie jest napisane, ale nie jest to dla mnie zrozumiałe zbytnio. Szukałem w googlach ale tamte wypowiedzi też mi nie wystarczały. Proszę aby ktoś mi wytłumaczył jak prostemu chłopowi co i jak. Dziękuje.

@Edit.

Właściwie to chciałem się dowiedzieć czegoś więcej o tych metodach żeby zrobić zadanie z kursu o następującej treści :

Napisz program, który wczyta liczbę, a następnie wypisze ją na ekranie. Zabezpiecz przed wczytaniem nieprawidłowej liczby. Wykorzystaj do tego celu wiedzę z jednego z poprzednich rozdziałów. Sposób działania programu:

  1. Podaj liczbę
  2. Jeżeli błąd, wróć do kroku 1.
  3. Wypisz liczbę, która została podana.

I za cholerę nie mogłem go zrobić przez niemal 3h, ale w końcu się udało. Mimo iż nadal nie mogę zrozumieć o co tu chodzi napisałem to...

 #include <iostream>
using namespace std;

int main()
{
float liczba;
bool prawda;

if (prawda = true)
{
    do
    {
        cout << "Podaj liczbe: ";
        cin >> liczba;
        prawda = cin.good();
        cin.clear();
        cin.sync();

    }while(prawda == 0 );
    cout << "Podales : " << liczba;
}

    return 0;
}

Ja to rozumiem tak : if ( prawda = true ) - w nawiasie warunek więc, żeby wykonać blok kodu bool prawda musi miec wartość true, ale dlaczego program się wykonuje skoro ja wcześniej nie pisałem że bool prawda = true? A i co oznacza zapis " prawda = cin.good(); "?

0
while(true)
  {
   cout<<"Podaj dwie liczby (!-koniec): ";
   unsigned X,Y;
   cin>>X>>Y;
   if(cin.good())
     {
      cout<<"Poprawnie: "<<X<<" "<<Y<<endl<<endl;
     }
   else // nie udało się (pewnie podano literki), jest ustawiony ios::badbit
     {
      cin.clear(); // resetujemy ustawione bity w tym ios::badbit
      if(cin.get()=='!') break; // nie byli to liczby bo podano znak '!'
      cout<<"Podaj liczby, nie litery"<<endl<<endl;
     }
   cin.sync(); // wywali to co zostało w buforze.
  }
0

Ja też się nasiedziałem trochę nad tym kodem i dzięki waszym postom częściowo zrozumiałem o co chodzi. Moja wersja kodu wygląda w ten sposób:

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    float liczba;
    bool prawda = cin.good();
    do
    {
        cout << "Podaj liczbe, nie wpisuj liter: ";
        cin >> liczba;
        cin.clear();cin.sync();

    }while(prawda != 0);
    cout << "Podales liczbe: " << liczba << endl;

    return 0;
}

Chciałem dodatkowo, żeby napisany program nie tylko nie akceptował liter, ale żeby też wpisana liczba musiała być różna od zera.
Udało mi się napisać działający program, ale nie rozumiem dlaczego taki zapis działa:

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    float liczba;
    bool prawda = cin.good();
    do
    {
        cout << "Podaj liczbe rozna od zera. Nie wpisuj liter: ";
        cin >> liczba;
        cin.clear();cin.sync();

    }while(liczba == 0 && prawda != 0);
    cout << "Podales liczbe: " << liczba << endl;

    return 0;
}

Chodzi o fragment kodu:

while(liczba == 0 && prawda != 0);

Według mnie, żeby program sprawdził, czy liczba jest różna od zera, a wprowadzony znak nie jest literą, kod powinien być jednym z poniższych:

while(liczba != 0 && prawda != 0) 
//lub tak
while(liczba == !0 && prawda != 0)

Niestety przy zastosowaniu powyższego kodu, w którym używam zapisu LICZBA RÓŻNA OD ZERA program akceptuje ZERO jako poprawne :/ Kiedy natomiast zapis to LICZBA RÓWNA ZERO, program działa poprawnie i nie pozwala na wpisanie ZERA. Ktoś wie o co chodzi?

0
#include <iostream>
using namespace std;
 
int main()
  {
   float liczba;
   while(true)
     {
      cout << "Podaj liczbe rozna od zera. Nie wpisuj liter: ";
      if((cin>>liczba)&&(liczba)) break;
      if(cin.eof()) { liczba=0; break; } // jeżeli nie musisz pilnować EOF to można wywalić.
      cin.clear();
      cin.sync(); 
     }
   cout<<"Podales liczbe: "<<liczba<<endl;
   return 0;
  }
0
WiTL napisał(a):

Ja też się nasiedziałem trochę nad tym kodem i dzięki waszym postom częściowo zrozumiałem o co chodzi. Moja wersja kodu wygląda w ten sposób:

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    float liczba;
    bool prawda = cin.good();
    do
    {
        cout << "Podaj liczbe, nie wpisuj liter: ";
        cin >> liczba;
        cin.clear();cin.sync();

    }while(prawda != 0);
    cout << "Podales liczbe: " << liczba << endl;

    return 0;
}

Chciałem dodatkowo, żeby napisany program nie tylko nie akceptował liter, ale żeby też wpisana liczba musiała być różna od zera.
Udało mi się napisać działający program, ale nie rozumiem dlaczego taki zapis działa:

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    float liczba;
    bool prawda = cin.good();
    do
    {
        cout << "Podaj liczbe rozna od zera. Nie wpisuj liter: ";
        cin >> liczba;
        cin.clear();cin.sync();

    }while(liczba == 0 && prawda != 0);
    cout << "Podales liczbe: " << liczba << endl;

    return 0;
}

Chodzi o fragment kodu:

while(liczba == 0 && prawda != 0);

Według mnie, żeby program sprawdził, czy liczba jest różna od zera, a wprowadzony znak nie jest literą, kod powinien być jednym z poniższych:

while(liczba != 0 && prawda != 0) 
//lub tak
while(liczba == !0 && prawda != 0)

Niestety przy zastosowaniu powyższego kodu, w którym używam zapisu LICZBA RÓŻNA OD ZERA program akceptuje ZERO jako poprawne :/ Kiedy natomiast zapis to LICZBA RÓWNA ZERO, program działa poprawnie i nie pozwala na wpisanie ZERA. Ktoś wie o co chodzi?

Program robi czynności z pętli kiedy liczba == 0 czyli że jak wpiszesz zero to on nadal będzie robił czynność z pętli

1 użytkowników online, w tym zalogowanych: 0, gości: 1