Операционная система UNIX. Руководство программиста

     

Ввод


Подпрограммы 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() читает символы и сохраняет их в буфере до тех пор, пока не будет нажат возврат каретки, перевод строки или клавиша ввода.
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 (); }
Допустим, Вы ввели строку "Мне нравится изучать систему UNIX". После нажатия возврата каретки экран будет выглядеть так:



scanw( )

СИНТАКСИС
  #include <curses.h>

int scanw (fmt [,arg...]) char *fmt;
ОПИСАНИЕ
  scanw() вызывает getstr() и сканирует введенную строку.
Подобно scanf(3S), scanw() использует формат для преобразования введенной строки и присваивает значения переменному количеству аргументов.

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 (); }
Обратите внимание на два вызова refresh(). После первого вызова на экране появляется строка, переданная addstr(), после второго - строка, которую возвращает scanw(). Кроме того, обратите внимание на вызов clear(). Допустим, Вы ввели строку 2,twin. После выполнения программы экран терминала будет выглядеть так:






Содержание раздела