Gaara Temat założony przez niniejszego użytkownika |
Obsługa strumienia wejściowego » 2014-07-06 21:35:55 Witam, dziś ktoś założył podobny temat, ale niestety mam trochę inny problem. A więc..dziś sobie przerabiałem temat http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Obsluga-strumienia-wejsciowego/12. Niby wszystko zrozumiałem, przeczytałem całą treść i zacząłem robić ZADANIE DOMOWE z tego działu. Dokładna jego treść to : "Napisz program, który wczyta trzy liczby rzeczywiste, a na końcu programu je wszystkie wypisze. Zadbaj o to, by bufor strumienia wejściowego był za każdym razem czyszczony. Wynik końcowy powinien również zawierać informacje czy wczytanie danej liczby się powiodło." Niestety mój problem polega na tym, że póki wszystkie dane użytkownik poda POPRAWNE, program działa pięknie, gorzej jest, jeśli podamy ZŁE dane. Dokładniej, jeśli wpiszę wszystkie 3 liczby rzeczywiste, ładnie je wyświetla i informuje, czy dane zostały wczytane prawidłowo. Gdy np w drugim strumieniu wejściowym zamiast liczby rzeczywistej podam jakiś tekst, wtedy program tak jakby kończy swoje działanie. Nie zamyka się, ale już nie mogę wprowadzić trzeciej liczby/wartości, a cała reszta "głupieje", tzn źle informuje o tym, czy dane zostały poprawnie wczytane. Mój kod wygląda następująco : #include <iostream> using namespace std; int main() { float a, b, c; cout << "Wprowadz liczbe pierwsza: "; cin >> a; cout << "Wprowadz liczbe druga: "; cin >> b; cout << "Wprowadz liczbe trzecia: "; cin >> c; cout << "Liczba pierwsza to: " << a << " Wczytano? " << cin.good() << ".\n"; cin.clear(); cin.sync(); cout << "Liczba druga to: " << b << " Wczytano? " << cin.good() << ".\n"; cin.clear(); cin.sync(); cout << "Liczba trzecia to: " << c << " Wczytano? " << cin.good() << ".\n"; cin.clear(); cin.sync(); return 0; }
|
|
Vister26 |
» 2014-07-06 21:48:11 Czyścisz bufor nie w tym miejscu co trzeba! Zastanów się czy użycie cin.clear() ma sens w tym miejscu twojego kodu. |
|
Gaara Temat założony przez niniejszego użytkownika |
» 2014-07-06 22:00:04 Vister, mógłbyś mnie naprowadzić ? :) Spróbowałem to trochę przerobić, w kursie pisze "przed każdym wczytaniem danych", a więc teraz spróbowałem tak : #include <iostream> using namespace std; int main() { float a, b, c; cout << "Wprowadz liczbe pierwsza: "; cin >> a; cout << "Wprowadz liczbe druga: "; cin >> b; cout << "Wprowadz liczbe trzecia: "; cin >> c; cout << "Liczba pierwsza to: "; cin.clear(); cin.sync(); cout << a << " Wczytano? " << cin.good() << ".\n"; cout << "Liczba druga to: "; cin.clear(); cin.sync(); cout << b << " Wczytano? " << cin.good() << ".\n"; cout << "Liczba trzecia to: "; cin.clear(); cin.sync(); cout << c << " Wczytano? " << cin.good() << ".\n"; return 0; }
Niestety dalej nie jest dobrze :) |
|
Vister26 |
» 2014-07-06 22:19:46 Musisz użyć cin.clear() bezpośrednio przed wczytaniem danych do zmiennej np. std::cin >> a; . Jeśli tego nie zrobisz to możesz zawiesić program jeśli wcześniej wpisałeś niepoprawne dane (tak jak napisałeś). Czyszczenie strumienia wejścia 3 razy pod koniec programu nie ma sensu ponieważ tam nie używasz std::cin , więc nie ma nic do czyszczenia. Natomiast, jeśli będziesz używał cin.clear() po każdym wczytaniu to musisz najpierw zapisać wartość cin.good() do jakiejś zmiennej (ponieważ cin.good() zwraca wartość tylko z ostatniego wczytania, więc 2 pierwsze ci przepadną). Wytłumaczyłem może trochę zbyt chaotycznie ale to powinno wyjaśnić sprawę ;) #include <iostream> using namespace std; int main() { float a, b, c; bool czydobrze1, czydobrze2; cout << "Wprowadz liczbe pierwsza: "; cin >> a; czydobrze1 = cin.good(); cin.clear(); cin.sync(); cout << "Wprowadz liczbe druga: "; cin >> b; czydobrze2 = cin.good(); cin.clear(); cin.sync(); cout << "Wprowadz liczbe trzecia: "; cin >> c; cout << "Liczba pierwsza to: " << a << " Wczytano? " << czydobrze1 << ".\n"; cout << "Liczba druga to: " << b << " Wczytano? " << czydobrze2 << ".\n"; cout << "Liczba trzecia to: " << c << " Wczytano? " << cin.good() << ".\n"; return 0; }
|
|
pekfos |
» 2014-07-06 22:40:39 Jeśli tego nie zrobisz to możesz zawiesić program jeśli wcześniej wpisałeś niepoprawne dane (tak jak napisałeś). |
Myślał indyk o niedzieli.. ;) Tu program nie ma na czym się zawiesić, a i nie ma większego sensu, by zawieszanie programu przez błędny kod z std::cin przedkładać nad inne błędne i wieszające się kody. |
|
Vister26 |
» 2014-07-06 22:43:28 Może nie umiem tłumaczyć, ale mój kod działa raczej poprawnie. Przynajmniej na razie ;) |
|
Gaara Temat założony przez niniejszego użytkownika |
» 2014-07-06 23:03:40 Vister26, dzięki wielkie! ;) Przejrzałem, wszystko rozumiem. Teraz mogę spokojnie przejść do następnego tematu :) |
|
« 1 » |