Ввод
Подпрограммы curses, предназначенные для чтения с текущего терминала, подобны тем, которые содержатся в stdio(3S) и читают из файла. Они позволяют:
- Читать символы по одному: getch().
- Читать строку, заканчивающуюся символом перевода строки: getstr().
- Сканировать вводимые символы, извлекая значения и присваивая их переменным из списка аргументов: scanw().
Первичной подпрограммой является getch(), которая обрабатывает и возвращает значение одного введенного символа. Она подобна подпрограмме getchar(3S) из библиотеки языка C, за исключением того, что она может производить некоторые зависящие от системы или терминала действия, которые не выполняет getchar(). Например, getch() можно использовать совместно с подпрограммой keypad() из библиотеки curses. Это позволяет программе распознавать и обрабатывать, как один символ, последовательности, начинающиеся с ESC, которые передаются, например, при нажатии клавиш управления курсором или функциональных клавиш. Дополнительную информацию о keypad() см. в описаниях getch() и keypad() в curses(3X).
Ниже описываются основные подпрограммы для ввода с терминала и даются примеры их использования.
getch( )
СИНТАКСИС | |
#include <curses.h>
int getch ( ) |
ОПИСАНИЕ | |
getch() читает один символ с текущего терминала. |
getch() возвращает значение этого символа или ERR при возникновении ситуации "конец файла", получении сигнала, или при чтении без ожидания, если символ еще не введен.
getch() является макросом.
См. далее, а также в curses(3X) описания echo(), noecho(), cbreak(), nocbreak(), raw(), noraw(), halfdelay(), nodelay() и keypad().
ПРИМЕР | |
#include <curses.h>
main () { int ch; initscr (); cbreak (); /* Пояснения см. в разделе "Опции ввода" */ addstr ("Введите любой символ: "); refresh (); ch=getch (); printw ("\n\n\nВы ввели '%c'.\n", ch); refresh (); endwin (); } |
Посмотрим, что выводит эта программа. Первый refresh() выводит цепочку символов, указанную в addstr(), из stdscr на экран терминала:
Пусть на клавиатуре нажали w. getch() принимает символ и его значение присваивается ch. Наконец, второй раз вызывается refresh() и экран становится таким:
Другой пример использования getch() см. в программе show в разделе Примеры программ, работающих с curses.
getstr( )
СИНТАКСИС | |
#include <curses.h> int getstr (str) char *str; |
ОПИСАНИЕ | |
getstr() читает символы и сохраняет их в буфере до тех пор, пока не будет нажат возврат каретки, перевод строки или клавиша ввода. |
Прочитанные символы пересылаются в цепочку str.
getstr() является макросом и вызывает getch() для чтения каждого символа.
getstr() возвращает ERR только тогда, когда getch()
возвращает ERR. В остальных случаях возвращается OK.
См. далее, а также в curses(3X) описания echo(), noecho(), cbreak(), nocbreak(), raw(), noraw(), halfdelay(), nodelay() и keypad().
ПРИМЕР | |
#include <curses.h> main () { char str [256]; initscr (); cbreak (); /* Пояснения см. в разделе "Опции ввода" */ addstr ("Введите строку символов,"); addstr (" оканчивающуюся <CR>:\n\n"); refresh (); getstr (str); printw ("\n\n\nВы ввели \n'%s'\n", str); refresh (); endwin (); } |
scanw( )
СИНТАКСИС | |
#include <curses.h> int scanw (fmt [,arg...]) char *fmt; |
ОПИСАНИЕ | |
scanw() вызывает getstr() и сканирует введенную строку. |
scanw() возвращает те же значения, что и scanf().
Дополнительную информацию см. в описании scanf(3S).
ПРИМЕР | |
include <curses.h> main () { char string [100]; float number; initscr (); cbreak (); /* Пояснения см. в разделе "Опции ввода" */ echo (); addstr ("Введите число и текст,"); addstr (" разделенные запятой:"); refresh (); scanw ("%f,%s", &number, string); clear (); printw ("Вы ввели текст \"%s\" и число %f.", string, number); refresh (); endwin (); } |