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 » |