[<<Previous Entry]
[^^Up^^]
[Next Entry>>]
[Menu]
[About The Guide]
Клавиатурный тренажер - Пример
Эта программа может служить в качестве клавиатурного тренажера, и
является примером неканонического ввода. Она выводит на экран строку
текста, и пользователь должен напечатать ее. Символы по мере ввода
проверяются. Если введен неправильный символ, программа издает
звуковой сигнал и печатает звездочку. Если введен правильный символ,
он выводится на экран. Программа работает так:
15-20 Терминальный специальный файл открывается для чтения, и его
текущий режим записывается в структуру termios. Библиотечная функция
isatty(3) проверяет, связан ли файловый дескриптор 1 с терминалом.
Иными словами, эта программа не должна исполняться с использованием
перенаправления стандартного ввода/вывода shell. Функция isatty
описана на странице руководства TTYNAME(3C).
22-24 Терминальный интерфейс переводится в режим неканонического
ввода без эхо и без обработки специальных символов.
25 Вызовом стандартной библиотечной функции setbuf(3) запрещается
локальная буферизация в библиотечных функциях вывода. Это приводит к
тому, что putchar(3) в следующих строках будет немедленно вызывать
write(2) в стандартный вывод.
28-37 Этот цикл читает по одному символу и сравнивает его с
соответствующим символом строки text. Если символ введен правильно, он
немедленно выводится на терминал. Иначе издается звуковой сигнал и на
терминал выводится звездочка.
Ниже приведен пример работы программы:
$ typtut
Type in beneath the following line
The quick brown fox jumped over the lazy dog's back
The *uick b*own f** jumped over t*e lazy dog's back
number of errors: 5
Файл: typtut.c
КЛАВИАТУРНЫЙ ТРЕНАЖЕР - ПРИМЕР НЕКАНОНИЧЕСКОГО ВВОДА
1 #include <unistd.h>
2 #include <stdio.h>
3 #include <fcntl.h>
4 #include <termios.h>
5 #include <string.h>
6 #include <stdlib.h>
7
8 main()
9 {
10 char ch, *text =
11 "The quick brown fox jumped over the lazy dog\'s back";
12 int fd, i, errors = 0, len;
13 struct termios tty, savtty;
14
15 fd = open("/dev/tty", O_RDONLY);
16 tcgetattr(fd, &tty);
17 if (isatty(fileno(stdout)) == 0) {
18 fprintf(stderr,"stdout not terminal\n");
19 exit(1);
20 }
21 savtty = tty;
22 tty.c_lflag &= ~(ISIG | ICANON | ECHO);
23 tty.c_cc[VMIN] = 1; /* MIN */
24 tcsetattr(fd, TCSAFLUSH, &tty);
25 setbuf(stdout, (char *) NULL);
26 printf("Type beneath the following line\n\n%s\n", text);
27 len = strlen(text);
28 for (i = 0; i < len; i++) {
29 read(fd, &ch, 1);
30 if (ch == text[i])
31 putchar(ch);
32 else {
33 putchar('\07');
34 putchar('*');
35 errors++;
36 }
37 }
38 tcsetattr(fd, TCSAFLUSH, &savtty);
39 printf("\n\nnumber of errors: %d\n", errors);
40 }