Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Чем в Linux можно заменить функцию getch()?

12K
17 сентября 2006 года
andrystepa
24 / / 08.06.2006
В консольной программе необходимо реагировать на нажатия клавиш. Тот код, что я использовал под виндами - функция getch() не проходит, так как компилятор не может найти заголовочного файла conio.h - да и я сам в полностью установленных ОС Mandriva Linux 2006 и Fedora Core 5 его не могу найти! Чем заменить?
5.4K
17 сентября 2006 года
Svyatozar
221 / / 11.09.2006
Q: Is there a getch() (from conio) equivalent on Linux/UNIX?

A: No. But it's easy to emulate:



code:--------------------------------------------------------------------------------

#include <stdio.h>
#include <termios.h>
#include <unistd.h>

int mygetch( ) {
struct termios oldt,
newt;
int ch;
tcgetattr( STDIN_FILENO, &oldt );
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt );
ch = getchar();
tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
return ch;
}--------------------------------------------------------------------------------


This code sets the terminal into non-canonical mode, thus disabling line buffering, reads a character from stdin and then restores the old terminal status. For more info on what else you can do with termios, see ``man termios''.
There's also a ``getch()'' function in the curses library, but it is /not/ equivalent to the DOS ``getch()'' and may only be used within real curses applications (ie: it only works in curses ``WINDOW''s)..


Thanks to VvV for writing this.
http://cboard.cprogramming.com/archive/index.php/t-27714.html
12K
18 сентября 2006 года
andrystepa
24 / / 08.06.2006
Нифига себе!!! Это что же простейшая функция считывания одного символа с клавиатуры должна выливаться в такого монстра?!! Как же тогда программа будет тормозить??!! Ведь на самом деле эта функция должна ждать прерывания от клавы, считать скан-код из порта клавиатуры, преобразовать его и возвратить!! Всего несколько инструкций процессора!
Я тут, поискавши, нашел библиотечную функцию getchar() - может она будет работать как надо?
240
18 сентября 2006 года
aks
2.5K / / 14.07.2006
Да, getchar будет работать.
Кстати никто не отменял функций getc и fgetc, которым в качестве файла можно подать stdin. Что и превращает их в тот же getchar =)) Правда ввод символа придется подтверждать.

А conio.h и описанная в нем getch() - они не стандартны. Они (помоему) в ДОСе появились вобще. Хотя в каком то хедере помоему всеже есть getch() - но он тоже не стандартный.
12K
18 сентября 2006 года
andrystepa
24 / / 08.06.2006
К сожалению, getchar() тоже требует нажатия на Enter. Но ведь как-то в программах осуществляется обработка нажатий клавиш - иначе бы "горячие клавиши" в консольных программах не работали!
Нашел инфу, что функция getch() есть в библиотеке ncurses. Нашел библиотеку в Contribute software, установил. Но при компиляции выводятся следующие ошибки:
undefined reference to 'stdscr'
undefined reference to 'wgetch'
Таких ссылок в моем исходнике нет, значит они пришли из ncurses.h - но как же так, в заголовочном файле библиотеки неопределенные ссылки? Что за ерунда!
12K
18 сентября 2006 года
andrystepa
24 / / 08.06.2006
Все, вопрос с библиотекой ncurses решен - надо было в опциях компилятора включить ключ -lcurses и все нормально скомпилировалось. Кроме того, перед использованием любой функции из ncurses необходимо вызвать функцию initscr() - в общем это все написано в man ncurses, после установки последнего.
5.4K
19 сентября 2006 года
Svyatozar
221 / / 11.09.2006
[QUOTE=andrystepa]Нифига себе!!! Это что же простейшая функция считывания одного символа с клавиатуры должна выливаться в такого монстра?!![/QUOTE]
Дело в том что Юникс писался для серверов к которым подключались десятки железных терминалов. "Консоль" в Линуксе - это специальная программа "эмулятор терминала", с собственной машиной состояний, поддерживающая буфер прокрученных строк, режимы ввода (построчный/посимвольный ввод, вкл./выкл. локальное эхо и т.д), набор escape-кодов для изменения яркости символов, цвета фона и проч - полнофункциональный текстовый браузер!
[QUOTE=andrystepa]Как же тогда программа будет тормозить??!! Ведь на самом деле эта функция должна ждать прерывания от клавы, считать скан-код из порта клавиатуры, преобразовать его и возвратить!! Всего несколько инструкций процессора![/QUOTE]
По умолчанию в Линуксе getchar() по-любому ждет ввода строки пока не нажата "Enter", и вводимый текст эхом отображается на экране. Возвращается только первый символ. В приведенном мной примере (а он действительно работает) построчный ввод с нажатием Enter и эхо выключаются, запускается getchar(), а потом режим терминала восстанавливается в прежнее состояние.
[QUOTE=andrystepa]Я тут, поискавши, нашел библиотечную функцию getchar() - может она будет работать как надо?[/QUOTE]
Библиотека curses поддерживает огромный набор функций терминала, просто я не вижу смысла ее присоединять ради одного getch() :eek:
12K
19 сентября 2006 года
andrystepa
24 / / 08.06.2006
К сожалению и с ncurses не очень то получается. Как я понял, эта библиотека создавалась для рисования графического интерфейса. Функция initscr(), как я понимаю, фактически создает новую консоль. Только в ней как-то странно работают операторы вывода в стандартный поток >>. Видимо там надо пользоваться чем-то другим, а вот чем - надо читать документацию. И все-таки, как же в консольных программах обрабатываются нажатия клавиш?
12K
22 сентября 2006 года
andrystepa
24 / / 08.06.2006
Все, всем спасибо, особенно Svyatozar - проблема решена!!! Ну и тупица же я!!! Человек ответил на вопрос сразу же, а я, не разобравшись в сути ответа, отверг его. Почему-то мне показалось, что в его рецепте надо при вводе каждого символа вызывать дополнительную функцию - где я это увидел, непонятно. Однако, зайдя на Unix Programming FAQ (v1.37) - http://www.opennet.ru/docs/FAQ/programming/unix-programming.html, я нашел там точно такой же ответ на мой вопрос, только с пояснениями!
5.4K
22 сентября 2006 года
Svyatozar
221 / / 11.09.2006
:)
я уж подумал что мои сообщения кроме меня никто не видит...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог