C++, Pętle i wprowadzanie danych tekstowych
Ostatnio zmodyfikowano 2018-01-25 15:46
Jakubes123 Temat założony przez niniejszego użytkownika |
C++, Pętle i wprowadzanie danych tekstowych » 2018-01-25 14:12:37 Hej, ucząc się c++ natknąłem się na temat którego naprawdę mam już solidnie dość ;( Chodzi o wprowadzanie danych z klawiatury/pliku dopóki nie zostanie wykryte EOF (koniec) itd... W książce C++ Szkoła programowania jest taki przykład:
char ch; int count = 0; while (cin.get(ch)) { ++count; } cout << endl << count << endl; cin.clear(); cin.get();
Ogólnie go rozumiem, cin.get(ch) konwertowane jest na wartości typu bool czyli true lub false (1 lub 0) tworząc warunek pętli, kombinacja <CTRL>+<Z>+<ENTER> wszystko przerywa... Jednak kiedy zapisze:
while (cin.get(ch)==true)
Mam błąd kompilacji , jak to możliwe skoro to wyrażenie i tak zwraca bool'a a ja tylko to sprawdzam? Natomiast to:
while (!cin.get(ch))
To zadziała (oczywiście odwrotna sytuacja, pętla nie wykona się ani razu kiedy nie natkniemy się na koniec). Przecież to też sprawdzanie czy wyrażenie zwraca true czy false... Już po kilka razy czytam te strony i coraz bardziej mnie to "niepokoji"
Dziękuje za pomoc i pozdrawiam :) |
|
wojownik266 |
» 2018-01-25 14:20:45 Według mnie funkcja get() nie jest typu bool:( http://www.cplusplus.com/reference/istream/istream/get/ |
|
darko202 |
» 2018-01-25 15:03:43 1 ważne jest, że wczytujesz to do zmiennej ch która jest typu char dlatego nie może być ona ani true, ani false i warunek pętli jest niespełniony Nazwa typu Ilość Bajtów Zakres wartości bool 1 false lub true char 1 od -128 do 127 http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Pojecie-zmiennej-i-podstawowe-typy-danych/112. na nowych/innych kompilatorach (od używanego przez autora) wiele przykładów ze starych książek się nie kompiluje, gdyż zawierają rozwiązania, które dziś uznawane są za błędy po prostu kompilatory są bardziej restrykcyjne wcześniej było wykonywana domyślne rzutowanie na odpowiedni typ zmienna dawała się zrzutować i było OK |
|
geceves |
» 2018-01-25 15:46:47 Sygnatura metody, której używasz to istream & get( char & c ); . Zauważ jakie zachowania dziedziczy po std::ios . a) http://www.cplusplus.com/reference/ios/ios/operator_bool/b) http://www.cplusplus.com/reference/ios/ios/operator_not/Zauważ, że od C++11 operator bool jest explicit: explicit operator bool() const; Musisz też wiedzieć, że konwersje w if czy while działają trochę inaczej niż przy wywołaniu niejawnej konwersji. Dlatego while( cin == false );
while( cin );
while( static_cast < bool >( cin ) == false );
Jeżeli nie jesteś zapoznany z niejawnymi i jawnymi konwersjami, ani z dziedziczeniem to po prostu przyjmij, że cin jest specjalnie napisany tak, aby go łatwo użyć w if i while , ale również tak aby zabezpieczyć się przed złym wykorzystaniem w innych miejscach i przypadkiem nie wysłać go do funkcji, które przyjmuje bool . |
|
« 1 » |