Jika linux Anda tidak memiliki conio.h
yang mendukung kbhit()
Anda dapat mencari kode Morgan Mattews di sini untuk memberikan kbhit()
fungsionalitas dengan cara yang kompatibel dengan sistem apa pun yang sesuai dengan POSIX.
Sebagai trik menonaktifkan buffering pada tingkat termios, itu juga harus menyelesaikan getchar()
masalah seperti yang ditunjukkan di sini.
Howto ncurses yang dikutip di atas dapat membantu. Berikut adalah contoh yang mengilustrasikan bagaimana ncurses dapat digunakan seperti contoh conio:
#include <ncurses.h>
int
main()
{
initscr();
cbreak();
noecho();
scrollok(stdscr, TRUE);
nodelay(stdscr, TRUE);
while (true) {
if (getch() == 'g') {
printw("You pressed G\n");
}
napms(500);
printw("Running\n");
}
}
Perhatikan bahwa dengan ncurses, iostream
tajuk tidak digunakan. Itu karena mencampur stdio dengan ncurses dapat memberikan hasil yang tidak diharapkan.
ncurses, ngomong-ngomong, mendefinisikan TRUE
dan FALSE
. Ncurses yang dikonfigurasi dengan benar akan menggunakan tipe data yang sama untuk bool
ncurses sebagai kompiler C++ yang digunakan untuk mengonfigurasi ncurses.
Solusi ringkas berdasarkan jawaban Christophe adalah
#include <sys/ioctl.h>
#include <termios.h>
bool kbhit()
{
termios term;
tcgetattr(0, &term);
termios term2 = term;
term2.c_lflag &= ~ICANON;
tcsetattr(0, TCSANOW, &term2);
int byteswaiting;
ioctl(0, FIONREAD, &byteswaiting);
tcsetattr(0, TCSANOW, &term);
return byteswaiting > 0;
}
Tidak seperti jawaban itu, ini tidak akan membuat terminal dalam keadaan aneh setelah program keluar. Namun, karakter tetap berada di buffer input, sehingga tombol yang ditekan akan muncul dengan tidak diinginkan pada baris prompt berikutnya.
Solusi berbeda yang memperbaiki masalah ini adalah
void enable_raw_mode()
{
termios term;
tcgetattr(0, &term);
term.c_lflag &= ~(ICANON | ECHO); // Disable echo as well
tcsetattr(0, TCSANOW, &term);
}
void disable_raw_mode()
{
termios term;
tcgetattr(0, &term);
term.c_lflag |= ICANON | ECHO;
tcsetattr(0, TCSANOW, &term);
}
bool kbhit()
{
int byteswaiting;
ioctl(0, FIONREAD, &byteswaiting);
return byteswaiting > 0;
}
Penggunaannya adalah sebagai berikut
enable_raw_mode();
// ...
if (kbhit()) ...
// ...
disable_raw_mode();
tcflush(0, TCIFLUSH); // Clear stdin to prevent characters appearing on prompt
Sekarang karakter apa pun yang diketik antara eksekusi baris pertama dan terakhir tidak akan muncul di terminal. Namun, jika Anda keluar dengan Ctrl+C, terminal adalah dibiarkan dalam keadaan aneh. (Mendesah)