curses содержит подпрограммы для записи
curses содержит подпрограммы для записи в stdscr, похожие на подпрограммы из stdio(3S) для записи в файл. Они позволяют:
- Выводить одиночный символ - addch().
- Выводить цепочку символов - addstr().
- Форматировать строку из нескольких входных аргументов - printw().
- Перемещать курсор, возможно, с одновременным выводом символа (символов) - move(), mvaddch(), mvaddstr(), mvprintw().
- Очистить весь экран или его часть - clear(), erase(), crltoeol(), clrtobot().
Далее следуют описания и примеры применения этих подпрограмм.
Предостережение
Библиотека curses располагает своим собственным набором подпрограмм ввода/вывода. Если Вы работаете с curses, Вам не следует использовать для ввода/вывода других подпрограмм или обращений к системе, например, read(2) или write(2); в противном случае при выполнении подпрограммы могут возникнуть нежелательные эффекты.
addch( )
СИНТАКСИС | |
#include <curses.h> int addch (ch) chtype ch; |
ОПИСАНИЕ | |
addch() записывает один символ в stdscr. |
Этот символ имеет тип chtype, который определяется в <curses.h>. chtype содержит данные и атрибуты (об атрибутах см. ниже в разделе Атрибуты вывода).
Работая с переменными этого типа, объявляйте их принадлежащими именно к типу chtype, а не к тому основному типу (скажем, short), через который объявляется chtype
в <curses.h>. Это обеспечит совместимость с будущими версиями.
addch() производит некоторую перекодировку. Так, она преобразует:
- символ перевода строки в последовательность, обеспечивающую очистку до конца строки и переход к новой строке; символ табуляции в соответствующее количество пробелов;
- другие управляющие символы в их запись в нотации ^X.
addch() обычно возвращает OK, за исключением случая вывода символа в правом нижнем углу нероллируемого окна, когда возвращается ERR.
addch() является макросом.
ПРИМЕР | |
#include <curses.h> main () { initscr (); addch ('a'); refresh (); endwin (); } |
Эта программа выводит следующее:
См. также программу show в разделе Примеры программ, работающих с curses.
addstr( )
СИНТАКСИС | |
#include <curses.h> int addstr (str) char *str; |
ОПИСАНИЕ | |
addstr() выводит цепочку символов в stdscr. |
addstr() вызывает addch() для вывода каждого символа.
addstr() производит ту же перекодировку, что и addch().
addstr() возвращает OK при успешном завершении и ERR
при ошибке.
addstr() является макросом.
ПРИМЕР | |
См. примеры программ во Введении. |
printw( )
СИНТАКСИС | |
#include <curses.h> int printw(fmt [,arg...]) char *fmt; |
ОПИСАНИЕ | |
printw() осуществляет форматированный вывод в stdscr. |
Подобно printf(3S), printw() получает формат и переменное количество аргументов.
Подобно addstr(), printw() обращается к addch() для вывода каждого символа.
printw() возвращает OK при успешном завершении и ERR
при ошибке.
ПРИМЕР | |
#include <curses.h> main () { char *title = "Не указано"; int no = 0; . . . initscr (); . . . printw ("%s отсутствует на складе.", title); printw ("Попросите кассира заказать %d для Вас.\n", no); refresh (); endwin (); } |
Эта программа выводит следующее:
move( )
СИНТАКСИС | |
#include <curses.h> int move (y, x); int y, x; |
ОПИСАНИЕ | |
move() устанавливает курсор в позицию "строка y, колонка x" окна stdscr. |
Обратите внимание, что первым аргументом move() является координата y, а вторым - x. Координаты левого верхнего угла stdscr равны (0, 0), а правого нижнего - (LINES-1, COLS-1). Подробнее см. в разделе Подпрограммы initscr(), refresh() и endwin().
Перемещение курсора можно производить одновременно с выводом данных, а именно:
- mvaddch (y, x, ch) перемещает курсор и выводит символ;
- mvaddstr (y, x, str) перемещает курсор и выводит цепочку символов;
- mvprintw (y, x, fmt[,arg...]) перемещает курсор и выводит форматированную строку.
move() возвращает OK при нормальном завершении и ERR
при ошибке. К ошибке приводит попытка сдвинуть курсор в позицию, не находящуюся между (0, 0) и (LINES-1, COLS-1).
move() является макросом.
ПРИМЕР | |
#include <curses.h> main() { initscr (); addstr ("Курсор должен быть здесь -->"); addstr (" если move () работает."); printw ("\n\n\nНажмите <CR> для завершения теста."); move (0, 28); refresh (); getch (); /* Вводит <CR>, см. ниже */ endwin (); } |
Эта программа выводит следующее:
После нажатия возврата каретки экран будет выглядеть так:
Другой пример использования move() можно найти в программе scatter в разделе Примеры программ, работающих с curses.
clear( ), erase( )
СИНТАКСИС | |
#include <curses.h> int clear ( ) int erase ( ) |
ОПИСАНИЕ | |
Обе подпрограммы заполняют все окно stdscr пробелами. |
clear() допускает наличие на экране мусора, о котором она не знает; эта подпрограмма вызывает сначала erase(), а затем clearok(), что приводит к полной очистке физического экрана при следующем вызове refresh() для stdscr. Подробнее о clearok() см. curses(3X).
initscr() автоматически вызывает clear().
clear() всегда возвращает OK, erase() не возвращает ничего полезного.
И clear(), и erase() являются макросами.
clrtoeol( ), clrtobot( )
СИНТАКСИС | |
#include <curses.h> int clrtoeol ( ) int clrtobot ( ) |
ОПИСАНИЕ | |
clrtoeol() заменяет остаток строки пробелами. |
clrtobot() заменяет остаток экрана пробелами.
Обе подпрограммы выполняют свои действия с позиции, в которой находится курсор (включительно).
Ни одна из подпрограмм не возвращает ничего полезного.
ПРИМЕР | |
Приведем текст программы, использующей clrtobot(). #include <curses.h> main () { initscr (); addstr ("Нажмите <CR> для удаления отсюда "); addstr ("до конца строки и далее."); addstr ("\nУдалите это тоже.\nИ это."); move (0, 32); refresh (); getch (); clrtobot (); refresh (); endwin (); } |
Эта программа выводит следующее:
Обратите внимание на два вызова refresh() - первый выводит этот текст на экран, второй очищает экран с отмеченного курсором места до конца.
После нажатия возврата каретки экран будет выглядеть так:
Примеры использования clrtoeol() см. в программах show и two в разделе Примеры программ, работающих с curses.