Kysthos Temat założony przez niniejszego użytkownika |
Rozdział 9, zadanie domowe » 2015-12-06 19:38:00 Korzystam z dwóch komputerów: pcta z Windowsem i z Maca. W związku z tym, że ani na Linuxie, ani na Macu nie działa metoda strumienia std::cin.sync(), postanowiłem zadanie domowe z rozdziału 9 zrobić na trzy sposoby. Napisałem taki kod z użyciem metody cin.sync(): #include <iostream> using namespace std; int main() { float a; float b; float c; bool OKa; bool OKb; bool OKc; cout << "Wprowadz liczbe: "; cin >> a; OKa = cin.good(); cin.clear(); cin.sync(); cout << "Wprowadz liczbe: "; cin >> b; OKb = cin.good(); cin.clear(); cin.sync(); cout << "Wprowadz liczbe: "; cin >> c; OKc = cin.good(); cin.clear(); cin.sync(); cout << "Liczba pierwsza to: " << a << ". Wczytano? " << OKa << "." << endl; cout << "Liczba druga to: " << b << ". Wczytano? " << OKb << "." << endl; cout << "Liczba trzecia to: " << c << ". Wczytano? " << OKc << "." << endl; return 0; } Na Windowsie wszystko działa w porządku. Na Macu oczywiście musiałem zmodyfikować kod ze względu na wyżej wspomnianą metodę cin.sync(). Próbowałem zmodyfikować wyżej zamieszczony kod na dwa sposoby: 1) wszystkie metody cin.sync() zamieniłem na cin.ignore( 1000, '\n' ); 2) pod #include <iostream> dodałem #include <limits>, a wszystkie metody cin.sync() zamieniłem na cin.ignore( numeric_limits < streamsize >::max(), '\n' ); Wszystkie trzy kody testowałem na przykładowych danych wejściowych z zadania domowego z rozdziału 9. Na Windowsie każdy kod działał tak, jak powinien. Problem pojawia się na Macu podczas testowania dwóch zmodyfikowanych kodów: gdy wprowadzam trzecią wartość z zadania domowego, czyli "33.22nie", wyświetlają się następujące dane wyjściowe: "Liczba trzecia to: 0. Wczytano? 0.". Jeżeli natomiast dodam spację pomiędzy liczbą a słowem, czyli "33.22 nie", wtedy działa i wyświetla się: "Liczba trzecia to: 33.22. Wczytano? 1.". Jak wspomniałem, na Windowsie ten problem nie występuje. Czy mógłby mi ktoś wytłumaczyć, dlaczego tak się dzieje, i wskazać, gdzie popełniam błąd? |
|
carlosmay |
» 2015-12-06 19:46:26 cin.ignore( numeric_limits < streamsize >::max(), '\n' ); cin.clear();
spróbuj w tej kolejności. |
|
Kysthos Temat założony przez niniejszego użytkownika |
» 2015-12-06 19:53:45 Niestety, w takiej kolejności program przy próbie wpisania drugiej przykładowej wartości, czyli "tak 123", nic nie wczytuje i pomija wczytywanie trzeciej liczby (sprawdzałem zarówno na Windowsie, jak i na Macu). |
|
carlosmay |
» 2015-12-06 20:19:44 cout << "Wprowadz liczbe: "; cin >> a; OKa = cin.good(); cin.clear(); while( cin.get() != '\n' ) continue;
|
|
Kysthos Temat założony przez niniejszego użytkownika |
» 2015-12-06 20:33:03 Dalej to samo: na Windowsie zapis, który zaproponowałeś, działa, a na Macu dane wejściowe "33.22nie" bez spacji nadal nie wczytują liczby (zapis ze spacją wczytuje). Dodam, że zarówno na Windowsie, jak i na Macu korzystam z Code::Blocks w wersji 13.12. |
|
Kysthos Temat założony przez niniejszego użytkownika |
» 2015-12-08 22:57:34 Sprawdzałem to dzisiaj jeszcze na Linuxie (Xubuntu) i wszystko działa, jak należy. Tylko na Macu występuje wyżej opisany przeze mnie problem. |
|
carlosmay |
» 2015-12-09 01:08:00 Wygląda jakby C::B na Macu nie obsługiwał wszystkich funkcji z klasy istream . Próbowałeś XCode? Zobacz może to wina kompilatora? Może w opcjach coś? |
|
Kysthos Temat założony przez niniejszego użytkownika |
» 2015-12-13 05:54:50 W końcu sprawdziłem i w Xcode jest taki sam rezultat – zapis bez spacji wywala 0, a ze spacją – 1. W C::B na Macu mam ten sam domyślny kompilator, co na pozostałych systemach: GNU GCC Compiler. Próbowałem zmieniać kompilator, ale chyba GNU GCC jest jedynym, który mam zainstalowany, bo tylko z nim kompiluje mi program. Z grzebaniem w opcjach mam taki problem, że jeszcze jestem dosyć zielony i też nie do końca wiem, czego miałbym szukać... No ale trudno, najwyżej będę się uczył raczej na Windowsie i Linuxie... |
|
« 1 » |