Błąd wczytywania ze strumienia do float

0

Mam taki kod:

  
  float a=1;
  cin >> a;
  if (!cin) cout << "!";
  cout << a << endl;

  char c = 'k';
  cin >> c;
  cout <<  c  << endl;
 

i nie rozumiem jego działanie w przypadku wprowadzenia ciągu znaków bez liczby (float) na początku np.
"aa bb"
Wyświetlony zostaje wykrzyknik, bo nie dało się wczytać float, ale zmienna a ustawiona wcześniej na 1, otrzymuje wartość 0. Dlaczego, jeżeli wczytywanie nie powiodło się? Nie powinna mieć wartości sprzed "cin >> a"?
Druga rzecz, której nie rozumiem to to, że później program ma wczytać znak z podanego wcześniej strumienia, czyli 'a'. Wynikiem jest jednak wyświetlenie '!' (błąd wczytania) oraz 'k'. Wygląda to tak jakby błędne wczytanie float "psuło" ;) mój strumień. Gdzie robię błąd?

0

Bo błędne wczytanie psuje strumień. Przechodzi on w stan błędu i trzeba wywołać cin.clear(); żeby móc go ponownie używać.

Zacznij czytanie od tego: http://www.cplusplus.com/reference/iostream/ios_base/iostate/

0

Rzeczywiście, błąd wczytywania psuje strumień (failbit). Żeby odzyskać sprawność, należy wywołać metodę clear() na strumieniu.

Co do samego floata: operator >> gwarantuje, że do zmiennej zostanie sparsowana maksymalna możliwa wartość w strumieniu, czyli np.:

// Wejście: 12.34blad
cin >> a; // a == 12.34

Ponieważ błąd pojawia się już na pierwszej pozycji strumienia, dość intuicyjną wartością zwracaną jest 0.

0

Ok, rozumiem. Nie wiedziałem, że strumienia w stanie błędu nie można czytać. Dzięki za pomoc.

0

zeby sie zabezpieczyc wystarczy dac while(!(cin>>x)){} i wyzerowac flagi bledow oraz wyczyscic bufor

0

Jeszcze jeden mały problem.
Jak w tym samym przykładzie wprowadzę do strumienia np.:
"+ab"
I po błędzie we wczytaniu float wykonam cin.clear(), to ze strumienia znika mi + (wczytanym znakiem char jest 'a'). Czy da się temu w prosty sposób zapobiec?
Pomyślałem, że cin może traktować plusa jako +0, no ale występuje błąd wczytywania, więc chyba nie.

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