Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

1. Прежде всего, вам следует, включить новый заголовочный файл в начало программы:

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <termios.h>

char *menu[] = {

 "a — add new record",

 "d — delete record",

 "q - quit",

 NULL,

};

2.

Затем нужно объявить пару новых переменных в функции
main
:

int getchoice(char *greet, char *choices[], FILE *in, FILE *out);

int main {

 int choice = 0;

 FILE *input;

 FILE *output;

 struct termios initial_settengs, new_settings;

3. Перед вызовом функции

getchoice
вам следует изменить характеристики терминала, этим определяется место следующих строк:

 if (!isatty(fileno(stdout))) {

fprintf(stderr, "You are not a terminal, OK.\n");

 }

 input = fopen("/dev/tty", "r");

 output = fopen("/dev/tty", "w");

 if (!input || !output) {

fprintf(stderr, "Unable to open /dev/tty\n");

exit(1);

 }

 tcgetattr(fileno(input), &initial_settings);

 new_settings = initial_settings;

 new_settings.c_lfag &= ~ICANON;

 new_settings.c_lflag &= ~ECHO;

 new_settings.c_cc[VMIN] = 1;

 new_settings.c_cc[VTIME] = 0;

 new_settings.c_lflag &= ~ISIG;

 if (tcsetattr(fileno(input), TCSANOW, &new_settings) != 0) {

fprintf(stderr, "could not set attributes\n");

 }

4. Перед завершением вы также должны вернуть первоначальные значения:

 do {

choice = getchoice("Please select an action", menu, input, output);

printf("You have chosen: %c\n", choice);

 } while (choice != 'q');

 tcsetattr(fileno(input), TCSANOW, &initial_settings);

 exit(0);

}

5. Теперь, когда вы в неканоническом режиме, необходимо проверить на соответствие возвраты каретки, поскольку стандартное преобразование CR (возврат каретки) в LF (переход

на новую строку) больше не выполняется:

int getchoice (char *greet, char *choices[], FILE *in, FILE *out) {

 int chosen = 0;

 int selected;

 char **option;

 do {

fprintf(out, "Choice: %s\n", greet);

option = choices;

while (*option) {

fprintf(but, "%s\n", *option);

option++;

}

do {

selected = fgetc(in);

} while (selected == '\n' || selected == '\r');

option = choices;

while (*option) {

if (selected == *option[0]) {

chosen = 1;

break;

}

option++;

}

if (!chosen) {

fprintf(out, "Incorrect choice, select again\n");

}

 } while(!chosen);

 return selected;

}

Пока вы не устроите все иначе, теперь, если пользователь нажмет в вашей программе комбинацию клавиш <Ctrl>+<C>, программа завершится. Вы можете отключить обработку этих специальных символов, очистив флаг

ISIG
в локальных режимах. Для этого в функцию
main
включается следующая строка:

new_settings.c_lflag &= ~ISIG;

Если вы внесете эти изменения в вашу программу меню, то будете получать немедленный отклик, и вводимый вами символ не будет отображаться на экране.

$ ./menu4

Choice: Please select an action

a — add new record

d — delete record

q — quit

You have chosen: a

Choice: Please select an action

a — add new record

d — delete record

q — quit

You have chosen: q $

Если вы нажмете комбинацию клавиш <Ctrl>+<C>, символ будет передан прямо в программу и будет истолкован, как неверный выбор.

Вывод терминала

С помощью структуры типа

termios
вы управляли вводом с клавиатуры, но было бы хорошо иметь такой же уровень управления выходными данными, отображаемыми на экране терминала. В начале главы вы применяли функцию
printf
для вывода символов на экран, не имея при этом возможности помещать их в определенное место экрана.

Поделиться:
Популярные книги

Русский орфографический словарь [А-Н]

Лопатин Владимир Владимирович
Справочная литература:
справочники
5.00
рейтинг книги
Русский орфографический словарь [А-Н]

Сумерки божков

Амфитеатров Александр Валентинович
1. Романы
Проза:
русская классическая проза
5.00
рейтинг книги
Сумерки божков

Статьи

Белинский Виссарион Григорьевич
Документальная литература:
критика
публицистика
5.00
рейтинг книги
Статьи

Печать Пожирателя 3

Соломенный Илья
3. Пожиратель
Фантастика:
городское фэнтези
аниме
сказочная фантастика
фэнтези
попаданцы
5.00
рейтинг книги
Печать Пожирателя 3

Нейромант. Трилогия «Киберпространство»

Гибсон Уильям
Фантастика:
боевая фантастика
киберпанк
5.00
рейтинг книги
Нейромант. Трилогия «Киберпространство»

Роканнон (сборник)

Ле Гуин Урсула Кребер
3. Вся Ле Гуин
Фантастика:
социально-философская фантастика
научная фантастика
7.00
рейтинг книги
Роканнон (сборник)

Неведомые поля (сборник)

Бигл Питер Сойер
Шедевры фантастики
Фантастика:
фэнтези
6.60
рейтинг книги
Неведомые поля (сборник)

Точка Бифуркации V

Смит Дейлор
5. ТБ
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Точка Бифуркации V

"Мистер Рипли" + Отдельные детективы и триллеры. Компиляция. Книги 1-12

Хайсмит Патриция
Детективы:
триллеры
5.00
рейтинг книги
Мистер Рипли + Отдельные детективы и триллеры. Компиляция. Книги 1-12

Замок Лорда Валентина

Силверберг Роберт
1. Маджипур
Научно-образовательная:
прочая научная литература
8.67
рейтинг книги
Замок Лорда Валентина

Приходи в прошлое

Тихая Лия
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Приходи в прошлое

Темное, кривое зеркало. Том 5 : Средь звезд, подобно гигантам.

Уильямс Гарэт Д.
5. Темное, кривое зеркало
Фантастика:
эпическая фантастика
альтернативная история
6.25
рейтинг книги
Темное, кривое зеркало. Том 5 : Средь звезд, подобно гигантам.

Театральная Энциклопедия

Неизвестен 3 Автор
Справочная литература:
словари
5.00
рейтинг книги
Театральная Энциклопедия

Путеводная звезда. Том 2

Извольский Сергей
7. Варлорд
Фантастика:
боевая фантастика
5.50
рейтинг книги
Путеводная звезда. Том 2