Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: Piotr Szawdyński
Kurs C++

Obsługa klawiatury za pomocą <conio.h>

[lekcja] Dokument opisuje bibliotekę używaną pod konsolą dla systemu Windows.

Biblioteki istotnym elementem nauki

Do tej pory poznałeś większość podstawowych poleceń, które umożliwiają już pisanie prostych programów. Zanim przejdziemy do bardziej zaawansowanych technik programowania, warto żebyś poznał kilka bibliotek, dzięki którym będziesz mógł lepiej i łatwiej wykorzystywać możliwości współczesnych komputerów.

Funkcja getch();

Jak już zapewne zauważyłeś kilkukrotnie dołączaliśmy już bibliotekę conio.h. Na końcu prawie każdego programu pisaliśmy getch(); dzięki czemu nasz program nie zamykał się odrazu i mogliśmy przeczytać komunikaty, jakie zostały wyświetlone na ekranie. Funkcja ta należy do biblioteki conio.h. Gdybyśmy nie dołączyli pliku conio.h kompilator pokazałby komunikat, że funkcja getch(); jest nieznana i nasz program by się nie skompilował.
Funkcja getch(); oprócz oczekiwania na znak, pozwala nam również odczytać kod wciśniętego klawisza na klawiaturze. Funkcja jest zdefiniowana następująco:
C/C++
int getch( void );
Pierwszy wyraz, czyli w tym wypadku int informuje nas jakiego typu dane są zwracane przez funkcję. Drugi wyraz, czyli tutaj getch stanowi nazwę funkcji. Pozostała część wiersza podana w nawiasach to parametry funkcji jakie przyjmuje. Słowo kluczowe void oznacza, że funkcja nie przyjmuje żadnych parametrów. Tak więc, jeśli chcemy odczytać kod znaku jaki został wciśnięty na klawiaturze, wystarczy napisać cout<<getch();. Niektóre klawisze na klawiaturze wysyłają dwa znaki do bufora. Funkcja getch(); odczytuje tylko po jednym znaku naraz, więc jeśli chcemy odczytać drugi znak znajdujący się w buforze, wywołujemy ponownie funkcję getch();.
W tym miejscu wiele książek przytacza całą długą listę kodów znaków, które mają poinformować Cię jaki kod znaku za jaki klawisz odpowiada. Moim zdaniem takie podejście do poważnego przyszłego programisty jest absurdalne i lekceważące. Każdy programista powinien sobie sam bez większych problemów sprawdzić jaki kod znaku stanowi dany klawisz. Na dowód moich słów prezentuję poniższy program:
C/C++
#include <iostream>
#include <conio.h>
int main()
{
    unsigned char znak;
    std::cout << "klawisz [ESC] wychodzi z programu." << std::endl;
    do
    {
        znak = getch();
        std::cout << "znak: '" << znak << "' kod: " << static_cast < int >( znak ) << std::endl;
        while( kbhit() )
        {
            znak = getch();
            std::cout << "*znak: '" << znak << "' kod: " << static_cast < int >( znak ) << std::endl;
        }
        std::cout << std::endl;
    } while( znak != 27 ); //ESC
   
    return( 0 );
}
Przedstawiony program wyświetla kod wciśniętego klawisza. Jak nietrudno zauważyć program jest bardzo krótki, bardzo prosty i wykorzystujący podstawowe zagadnienia, jakie na tym etapie programowania powinieneś już biegle znać. Wyjątkiem jest tu funkcja kbhit(); której jeszcze nie znasz, a właściwie zaraz ją dokładnie poznasz.

Funkcja kbhit();

Czasami zachodzi potrzeba sprawdzenia czy w buforze klawiatury znajdują się jeszcze jakieś dane do odczytania. Z pomocą przychodzi nam funkcja kbhit();. Funkcja ta sprawdza, czy w buforze klawiatury znajdują się dane do odczytania. Jeśli tak, funkcja zwraca wartość 1 (true), w przeciwnym wypadku zwraca wartość 0 (false).
C/C++
int kbhit( void );
//można się też spotkać z zapisem:
bool kbhit( void );
Zapis funkcji się czyta analogicznie jak w przypadku funkcji getch();. Zwracany typ danych to int (bool), nazwa to kbhit i void oznacza, że funkcja nie przyjmuje dodatkowych parametrów.

Rzutowanie danych

W zaprezentowanym programie został użyty zapis, static_cast<int>(znak). Bez uruchomienia tego programu zapis może być dla Ciebie niejasny i nic w tym dziwnego, bo do tej pory tego jeszcze nie omawialiśmy. Najprościej mówiąc to poinformowaliśmy kompilator, że nie interesuje nas aktualna postać zmiennej znak (która jest typu char) i chcielibyśmy, aby dane były traktowane przez kompilator jak liczba, czyli typ int. W efekcie tego, zamiast wypisania przez program znaku, otrzymaliśmy kod znaku. Temat rzutowania zostanie omówiony szerzej i dokładniej w jednym z  dalszych rozdziałów. Na chwilę obecną warto zapamiętać tą sztuczkę i nie przejmować się jeśli pojęcie rzutowania jest niejasne. W końcu będzie poświęcony temu zagadnieniu osobny rozdział :)

Pozostałe informacje

Biblioteka conio.h posiada również inne funkcje, jednak nie są one na tyle interesujące, żeby opisywać je tutaj. Nie polecam też drążyć na siłę wszystkich nie omówionych funkcji z bibliotek, ponieważ i tak nie będziesz w stanie zapamiętać ich działania. Szukaj informacji, gdy nie masz narzędzia by osiągnąć cel. W Internecie prawdopodobnie nakierują Cię na dobrą drogę. W tym celu polecam skorzystanie z naszego forum. A jeśli tam nie znajdziesz pomocy, szukaj jej gdziekolwiek. Stron w Internecie jest dużo :)
Poprzedni dokument Następny dokument
Biblioteka <string> Biblioteka <time.h>