Obsluga strumienia wejsciowego.
Ostatnio zmodyfikowano 2017-12-04 23:22
malpa121 Temat założony przez niniejszego użytkownika  | 
Obsluga strumienia wejsciowego. » 2017-12-04 18:14:16 Cześć, natknąłem się na podobny temat, ale on dotyczył czegoś innego niż mój problem. A mianowicie, rozwiązuje zadanie z kursu (http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Obsluga-strumienia-wejsciowego/12). Wszystko pięknie, ładnie tyle, że program nie wychwytuję błędu, gdy wpisuje nieprawidłowe wartości. #include <iostream> int main() {     float a;     int b;     float c;          std::cin >> a;     std::cin.clear();     std::cin.sync();          std::cin >> b;     std::cin.clear();     std::cin.sync();          std::cin >> c;          std::cin.clear();     std::cin.sync();          std::cout << "liczbia pierwsza to: " << a << std::endl;     std::cout << " wczytano? " << std::cin.good() << std::endl;     std::cin.clear();     std::cin.sync();               std::cout << "liczba druga to: " << b << std::endl;     std::cout << " wczytano? " << std::cin.good() << std::endl;     std::cin.clear();     std::cin.sync();               std::cout << "liczba trzecia to: " << c << std::endl;     std::cout << " wczytano? " << std::cin.good() << std::endl;     std::cin.clear();     std::cin.sync();     return 0; } https://imgur.com/bpx0xAv Bardzo proszę o pomoc bo za nic nie mogę dojść gdzie popełniam błąd. (wklejam link bo przez BBC mi nie wyswietla)  | 
 | 
RazzorFlame  | 
» 2017-12-04 18:43:49 std::cout << " wczytano? " << std::cin.good() << std::endl; Za każdym razem wyświetlasz tą samą wartość. Pomyśl co zrobiłeś: Wczytałeś trzy razy jakąś liczbę. Po każdym razie wyczyściłeś flagi błędu.Następnie wyświetlasz po kolei liczby i 3x sprawdzasz czy  cin.good. Dostaniesz trzy te same wyniki bo sprawdzasz to pod koniec. Dodatkowo zawsze dostaniesz  1 (true) bo czyścisz flagi po wczytaniu każdej liczby. Z mojego punktu widzenia postanowiłeś wstawiać  std::cin.clear(), std::cin.sync() gdzie tylko popadnie. Teraz jak to powinno wyglądać. Zawsze patrz na to pod względem pojedynczego wczytania: załóżmy, że chcesz wczytać jedną liczbę i sprawdzić czy poprawnie została wczytana. Na końcu czyścisz flagi, żeby poprawnie wczytać resztę danych: #include <limits>  
 
 
  int myNum = 0; std::cin >> myNum; if( !std::cin.good() )      std::cout << "Niestety, podales dane w zlym formacie." << std::endl;
  std::cin.clear();  std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
  Tak to poprawnie powinno wyglądać. O ile pierwsze linijki są stosunkowo proste do zrozumienia, to ta ostatnia jest interesująca. Nie powinno się używać  std::cin.sync(), gdyż nie służy ona do tego co chcemy osiągnąć (chociaż na systemach Windows prawdopodobnie będzie działać). Ostatnia linijka mówi, że  wszystkie poprzednio wczytane znaki do znaku nowej linii (stąd:  '\n') mają zostać zignorowane. Wczystkie, dlatego że  std::numeric_limits<std::streamsize>::max() pobiera maksymalną liczbę znaków, które mogły zostać zapisane przy wczytaniu.  | 
 | 
malpa121 Temat założony przez niniejszego użytkownika  | 
» 2017-12-04 23:22:39 zapewne to co podales jest pomocne, lecz wykorzystane sa mozliwosci ktorych jeszcze nie bylo w kursie. Wlasnie ostatni akapit kursu pominalem bo był, dla Linuksa.  | 
 | 
|  « 1 »  |