Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

C++, Pętle i wprowadzanie danych tekstowych

Ostatnio zmodyfikowano 2018-01-25 15:46
Autor Wiadomość
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 :)
P-168983
wojownik266
» 2018-01-25 14:20:45
Według mnie funkcja
get()
 nie jest typu bool:(
http://www.cplusplus.com/reference/istream/istream/get/
P-168984
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​/11

2.
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
P-168985
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
C/C++
while( cin == false ); // błąd

while( cin ); // ok

while( static_cast < bool >( cin ) == false ); // ok


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
.
P-168986
« 1 »
  Strona 1 z 1