snipplets.dev/code/C/conio.h/README.md
2023-09-26 22:05:13 +03:00

720 lines
61 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# conio.h 📑
В этом документе представлены описания и работа функций с примерами заголовоного файла `conio.h`.
По факту, весь материал спизжен с сайта http://www.c-cpp.ru/funkcii/conioh,
но из-за наличия на 50% страницы рекламы, читать материал затруднительно.
Если считаешь, что я нарушил чьи-то права, то мне как-то ПОХУЙ.
В интернете всё общее + на всех страницах не было текста, что материал
копировать запрещено... ПОХУЙ В ДВОЙНЕ!
В ходе **Copy-Paste** была поправлена вёрстка кода и другие улучшения.
## Содержание
* [`_setcursortype`](#void-_setcursortype-int-type)
* [`getpass`](#char-getpass-const-char-str)
* [`window`](#void-window-int-left-int-top-int-right-int-bottom)
* [`wherex`/`wherey`](#int-wherex-void-%D0%B8-int-wherey-void)
* [`textmode`](#void-textmode-int-mode)
* [`textcolor`](#void-textcolor-int-color)
* [`textbackground`](#void-textbackground-int-color)
* [`textattr`](#void-textattr-int-attr)
* [`puttext`](#int-puttext-int-left-int-top-int-right-int-bottom-void-buf)
* [`normvideo`](#void-normvideo-void)
* [`lowvideo`](#void-lowvideo-void)
* [`highvideo`](#void-highvideo-void)
* [`movetext`](#int-movetext-int-left-int-top-int-right-int-bottom-int-newleft-int-newtop)
* [`insline`](#void-insline-void)
* [`gotoxy`](#void-gotoxy-int-x-int-y)
* [`gettextinfo`](#void-gettextinfo-struct-text_info-info)
* [`gettext`](#int-gettext-int-left-int-top-int-right-int-bottom-void-buf)
* [`delline`](#void-delline-void)
* [`cscanf`](#int-cscanf-char-fmt)
* [`cputs`](#int-cputs-const-char-str)
* [`cprintf`](#int-cprintf-const-char-fmt)
* [`clreol`/`clrscr`](#void-clreol-void-%D0%B8-void-clrscr-void)
* [`kbhit`](#int-kbhit)
* [`ungetch`](#int-ungetch-int-ch)
* [`getch`/`getche`](#int-getch-void-%D0%B8-int-getche-void)
## `void _setcursortype(int type)`
### Описание:
Эта функция не определена стандартом ANSI С.
Функция `_setcursortype()` изменяет внешний вид курсора.
Она может быть вызвана с передачей ей одного из следующих трех макросов,
которые определены в файле `conio.h`.
Вызов функции с макросом `_NOCURSOR` отключает курсор.
Использование макроса `_SOLIDCURSOR` задает прямоугольный курсор,
занимающий символьную позицию.
Использование макроса `_NORMALCURSOR` создает стандартный курсор.
### Пример:
```c
/* Следующий фрагмент кода изменяет курсор */
_setcursortуре(_SOLIDCURSOR);
```
## `char *getpass(const char *str)`
### Описание:
Эта функция не определена стандартом ANSI С.
После вывода на экран подсказки `str`, функция `getpass()`
возвращает указатель на строку, завершающуюся нулевым символом длиной
не более восьми символов. Эта строка статически размещается
в памяти функцией `getpass()` и переписывается всякий раз при вызове функции.
Если необходимо сохранить эту строку, ее нужно скопировать в какое-либо место в памяти.
Нажатые клавиши не отображаются эхом на экране во время ввода пароля.
### Пример:
```c
/* Следующая функция ожидает ввода подходящего пароля */
#include <conio.h>
#include <string.h>
void pswd(char *pw) {
char *input;
do {
input = getpass ("Enter your password: ");
} while (!strcmp("starbar", input));
printf("You're in!");
}
```
## `void window(int left, int top, int right, int bottom)`
### Описание:
Функция `window()` используется для создания прямоугольного текстового окна,
имеющего левый верхний угол и правый нижний угол в точках с координатами
`left`, `top` и `right`, `bottom` соответственно.
Если какая-либо из координат недействительна, то функция `window()` не выполняет никаких действий.
После успешного вызова функции `window()` все ссылки
на координаты местоположения интерпретируются относительно окна, а не экрана.
### Пример:
```c
/* Следующий фрагмент кода создает окно
и записывает строку текста в точку
с координатами 2, 3 относительно окна */
window (10, 10, 60, 15);
gotoxy(2, 3);
cprintf("at location 2, 3");
```
## `int wherex(void)` и `int wherey(void)`
### Описание:
Функции `wherex()` и `wherey()` возвращают текущие координаты курсора
`х` и `у` по отношению к текущему текстовому окну.
### Пример:
```c
/* Следующий фрагмент кода присваивает переменным
xpos и ypos значения координат х и у */
int xpos, ypos;
xpos = wherex();
ypos = wherey();
```
## `void textmode(int mode)`
### Описание:
Функция `textmode()` используется для изменения видеорежима текстового экрана.
Аргумент `mode` может принимать одно из значений, показанных в следующей таблице.
Можно использовать либо целое значение, либо соответствующий макрос,
который определен в файле `conio.h`:
| Макрос | Числовой эквивалент | Описание |
|----------|---------------------|-------------------------------------|
| BW40 | 0 | 40-кодоночный черно-белый |
| С40 | 1 | 40-колоночный цветной |
| BW80 | 2 | 80-колоночный черно-белый |
| С80 | 3 | 80-колоночный цветной |
| MONO | 1 | 80-колоночный монохромный |
| С4350 | 64 | 43-строчный EGA или 50-строчный VGA |
| LASTMODE | -1 | Предыдущий режим |
После вызова функции `textmode()` экран переустанавливается
и все атрибуты текстового экрана возвращаются к своим значениям по умолчанию.
### Пример:
```c
/* Следующий фрагмент кода переводит видеорежим на 80-колоночный цветной */
textmode(С80);
```
## `void textcolor(int color)`
### Описание:
Функция `textcolor()` устанавливает цвет символов, выводимых на текстовый экран.
Работает в старых компиляторах таких, как **Turbo C** и **Dev C**.
Она также может быть использована для задания мерцающих символов.
Ниже представлены допустимые значения параметра `color` вместе с именами макросов,
определенных в файле `conio.h`:
| Макрос | Цифровой эквивалент |
|--------------|---------------------|
| BLACK | 0 |
| BLUE | 1 |
| GREEN | 2 |
| CYAN | 3 |
| RED | 4 |
| MAGENTA | 5 |
| BROWN | 6 |
| LIGHTGRAY | 7 |
| DARKGRAY | 8 |
| LIGHTBLUE | 9 |
| LIGHTGREEN | 10 |
| LIGHTCYAN | 11 |
| LIGHTRED | 12 |
| LIGHTMAGENTA | 13 |
| YELLOW | 14 |
| WHITE | 15 |
| BLINK | 128 |
Цвет символов на экране не изменяется функцией `textcolor()`.
Изменения касаются только тех символов, которые будут выведены после функции `textcolor()`.
### Пример:
```c
/* Следующий фрагмент кода выводит текст с помощью мерцающих символов */
textcolor(BLINK);
```
## `void textbackground(int color)`
### Описание:
Функция `textbackground()` устанавливает цвет фона текстового экрана.
Вызов функции `textbackground()` воздействует только на цвет фона последующих операций записи.
Допустимые цвета определяются с помощью макросов, содержащихся в файле `conio.h`, и представленных ниже.
| Макрос | Цифровой эквивалент |
|-----------|---------------------|
| BLACK | 0 |
| BLUE | 1 |
| GREEN | 2 |
| CYAN | 3 |
| RED | 4 |
| MAGENTA | 5 |
| BROWN | 6 |
| LIGHTGRAY | 7 |
Новый цвет фона становится видимым после вызова функции `textbackground()`.
### Пример:
```c
/* Следующий фрагмент кода устанавливает цвет фона текстового экрана голубым */
textbackground(CYAN);
```
## `void textattr(int attr)`
### Описание:
Функция `textattr()` устанавливает одновременно как цвета переднего плана, так и фона.
Величина параметра `attr` представляет собой закодированную информацию о цвете.
Способ кодировки представлен ниже.
![](data:image/png;base64,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)
При установке значения 1 в разряде 7 текст мерцает.
Разряды с 6 по 4 определяют цвет фона.
Разряды с 3 по 0 определяют цвет текста.
Наиболее простой способ задать цвет фона заключается в том,
чтобы умножить номер желаемого цвета на 16
и сложить его с цветом текста с помощью операции побитовое ИЛИ.
Например, чтобы создать зеленый фон с синим текстом,
можно использовать `GREEN*16 | BLUE`.
Для того, чтобы заставить этот текст мерцать, к результату надо применить операцию побитового ИЛИ
с макросом `BLINK(128)`.
### Пример:
```c
/* Следующая инструкция выводит текст,
мерцающий красным цветом на синем фоне */
textattr(RED | BLINK | BLUE*16);
```
## `int puttext(int left, int top, int right, int bottom, void *buf)`
### Описание:
Функция `puttext()` копирует текст, предварительно сохраненный с использованием функции `gettext()`.
Копирование осуществляется из буфера, на который указывает переменная `buf`,
в область, левая верхняя точка которой имеет координаты `left` и `top`,
а правая нижняя — `right` и `bottom`.
Функция `puttext()` использует абсолютные координаты экрана,
а не координаты относительно окна. Она возвращает значение `0`,
если координаты выходят за допустимую область,
и ненулевое значение — в противном случае.
### Пример:
```c
/* Следующий фрагмент кода копирует область экрана в память,
на которую указывает параметр buf,
а затем помещает этот текст в новое место на экране */
buf = malloc (10 * 10 *2);
gettext(10, 10, 20, 20, buf);
puttext(0, 0, 30, 30, buf);
```
## `void normvideo(void)`
### Описание:
После вызова функции `normvideo()` изображенные на экране символы выводятся
в режиме нормальной интенсивности.
Эта функция работает только для текстовых экранов.
### Пример:
```c
/* Следующий фрагмент кода включает режим вывода с нормальной интенсивностью */
normvideo();
```
## `void lowvideo(void)`
**Описание**
После вызова функции `lowvideo()` изображенные на экране символы выводятся
в режиме пониженной яркости.
Эта функция работает только для текстовых экранов.
### Пример:
```c
/* Следующий фрагмент кода включает вывод с пониженной яркостью */
lowvideo();
```
## `void highvideo(void)`
### Описание:
После вызова функции `highvideo()` выводимые на экран символы изображаются
в режиме повышенной яркости. Эта функция работает только для текстовых экранов.
### Пример:
```c
/* Следующий фрагмент кода включает вывод с повышенной яркостью */
highvideo();
```
## `int movetext(int left, int top, int right, int bottom, int newleft, int newtop)`
### Описание:
Функция `movetext()` перемещает часть текста по экрану.
Текст берется из прямоугольника с левым верхним углом
в точке с координатами `left`, `top` и правым нижним углом
в точке с координатами `right`, `bottom`.
Точка положения нового верхнего угла имеет координаты
`newleft`, `newtop`. Эта функция относится не к окну, а к экрану.
Функция `movetext()` возвращает `0`,
если хотя бы одна из координат выходит за пределы допустимой области,
и ненулевое значение — в противном случае.
### Пример:
```c
/* Следующий фрагмент кода передвигает содержимое прямоугольника
с левым верхним углом в точке 1, 1
и правым нижним углом в точке 8, 8 в точку 10, 10 */
movetext(1, 1, 8, 8, 10, 10);
```
## `void insline(void)`
### Описание:
Функция `insline()` вставляет пустую строку в текущее положение курсора.
Все строки ниже курсора сдвигаются вниз.
Эта функция предназначена только для текстового режима
и выполняет операцию вставки относительно текущего текстового окна.
### Пример:
```c
/* Следующая программа иллюстрирует использование функции insline() */
#include <conio.h>
int main(void) {
register int i;
clrscr();
for (i = 1; i<24; i + + ) {
gotoxy(1, i);
cprintf("This is line %d\n\r", i);
}
getche();
gotoxy(1, 10);
insline();
getch();
return 0;
}
```
## `void gotoxy(int x, int y)`
### Описание:
Функция `gotoxy()` помещает курсор текстового экрана в точку с координатами х, у.
Если хотя бы одна из координат недействительна, то никаких действий не выполняется.
### Пример:
```c
/* Следующая программа выводит символы X по диагонали экрана */
#include <conio.h>
int main(void) {
register int i, j;
/* вывод диагонали из Х-ов */
clrscr ();
for(i = 1, j = 1; j < 24; i+=3, j++) {
gotoxy(i, j);
cprintf("X");
}
getche();
clrscr();
return 0;
}
```
## `void gettextinfo(struct text_info *info)`
### Описание:
Функция `gettextinfo()` получает текущие установки текста
и возвращает их в структуре, на которую указывает параметр `info`.
Структура `text_info` объявлена следующим образом:
```c
struct text_info {
unsigned char winleft; /* координаты */
unsigned char wintop; /* верхнего левого угола */
unsigned char winright; /* координаты */
unsigned char winbottom; /* нижнего правого угола */
unsigned char attribute; /* текущие атрибуты */
unsigned char normattr; /* нормальные атрибуты */
unsigned char currmode; /* активный видеорежим */
unsigned char screenheight; /* размеры */
unsigned char screenwidth; /* экрана */
unsigned char curx; /* текущие координаты */
unsigned char cury; /* курсора */
};
```
### Пример:
```c
/* Следующий фрагмент получает текущие установки текста */
struct text_info i;
gettextinfo(&i);
```
## `int gettext(int left, int top, int right, int bottom, void *buf)`
### Описание:
Функция `gettext()` копирует текст из прямоугольника
с левым верхним углом в точке `left`, `top`
и с правым нижним углом в точке с координатами `right`, `bottom`.
Текст копируется в буфер, на который указывает переменная `buf`.
Координаты относятся не к окну, а к экрану.
Необходимое количество памяти для хранения области экрана вычисляется по формуле
`число_байт = строки * столбцы * 2`.
Причина, по которой необходимо умножить число столбцов на число строк
и умножить это произведение на `2`, заключается в том, что каждый символ,
выводимый на экран, требует для хранения **2 байта**:
1 байт для самого символа и 1 байт для его атрибутов.
Функция возвращает в случае успеха `1` и `0` при ошибке.
### Пример:
```c
/* Следующий фрагмент кода копирует область экрана в память,
на которую указывает параметр buf */
buf = malloc(10 * 10 *2);
gettext(10, 10, 20, 20, buf);
```
## `void delline(void)`
### Описание:
Функция `delline()` удаляет строку в активном окне, которая содержит курсор.
Все линии ниже удаляемой поднимаются вверх.
Надо помнить, что если текущее окно меньше целого экрана,
то воздействие оказывается только на текст в окне.
### Пример:
```c
/* Следующая программа выводит 24 строки и затем убирает строку 3 */
#include <conio.h>
int main(void) {
register int i; clrscr();
for (i = 0; i < 24; i++) cprintf("line %d\n\r", i);
getch();
gotoxy(1, 3);
delline();
getch();
return 0;
}
```
## `int cscanf(char *fmt, ...)`
### Описание:
Функция `cscanf()` работает так же, как и функция scanf(),
за исключением того, что она читает информацию с консоли вместо `stdin`.
Она не может быть перенаправлена. Относительно подробностей следует обратиться
к описанию функции `scanf()`.
Функция `cscanf()` возвращает число аргументов, которым были присвоены значения.
Это число не включает пропущенные поля. Функция `cscanf()` возвращает значение `EOF` в случае,
если была сделана попытка чтения за пределами конца файла.
### Пример:
```c
/* Следующий фрагмент кода читает с консоли строку и число с плавающей точкой */
char str[80];
float f;
cscanf("%s%f", str, &f);
```
## `int cputs(const char *str)`
### Описание:
Функция `cputs()` выводит в текущее текстовое окно строку,
на которую указывает параметр `str`.
Ее вывод не может быть перенаправлен,
и она автоматически предотвращает пересечение границ окна.
Функция возвращает последний символ, либо величину `EOF` в случае возникновения ошибки.
### Пример:
```c
/* Следующая программа создает окно и использует функцию cputs() для записи строки,
которая не умещается в окне. Текст фактически переносится на новую строку в конце окна */
#include <conio.h>
void border(int, int, int, int);
int main(void) {
clrscr();
/* создание первого окна */
window(3, 2, 40, 9);
border(3, 2, 40, 9);
gotoxy(1,1);
cputs("This line will be wrapped at the end of the window.");
getche();
return 0;
}
/* вывод границы вокруг первого окна */
void border(int startx, int starty, int endx, int endy) {
register int i;
gotoxy(1, 1);
for (i = 0; i <= endx - startx; i++) putch('-');
gotoxy(1, endy - starty);
for(i = 0; i <= endx - startx; i++) putch('-');
for(i = 2; i < endy-starty; i++) {
gotoxy(1, i);
putch('|');
gotoxy(endx - startx + 1, i);
putch('|');
}
}
```
## `int cprintf(const char *fmt, ...)`
### Описание:
Функция `cprintf()` работает так же, как и функция `printf()`,
с тем только отличием, что она пишет в текущее окно вместо `stdout`.
Ее вывод не может быть перенаправлен, и она автоматически предотвращает вывод за пределы окна.
Относительно подробностей следует обратиться к описанию функции `printf()`.
Функция `cprintf()` не преобразует символ новой строки (`\n`)
в пару **перевод строки — возврат каретки**,
как это имеет место в случае функции `printf()`.
Поэтому необходимо явным образом ставить символ возврата каретки (`\r`),
если в этом есть необходимость.
Функция `cprintf()` возвращает число фактически выведенных символов.
Отрицательное возвращаемое значение означает наличие ошибки.
### Пример:
```c
/* Следующая программа выводит данные, представленные ниже в комментариях */
#include <conio.h>
int main(void) {
/* выводит выровненное по левому краю
"this is a test" в 20-символьном поле */
cprintf("%-20s", "this is a test");
/* выводит вещественное значение с тремя цифрами после запятой
в 10-символьном поле. В результате работы выведется " 12.235" */
cprintf("%10.3f\n\r", 12.234657);
return 0;
}
```
## `void clreol(void)` и `void clrscr(void)`
### Описание:
Функция `clreol()` очищает строку от текущей позиции курсора и до конца строки активного окна.
Позиция курсора не изменяется.
Функция `clrscr()` полностью очищает активное текстовое окно
и помещает курсор в левый верхний угол (1, 1).
### Пример:
```c
/* Следующая программа иллюстрирует использование функций clreol() и clrscr() */
#include <conio.h>
int main(void) {
register int i;
gotoxy(10, 10);
cprintf("This is a test of the clreol() function.");
getch();
gotoxy(10, 10);
clreol();
for(i = 0; i < 20; i++) cprintf("Hello there\n\r");
getch();
/* очистка экрана */
clrscr();
return 0;
}
```
## `int kbhit()`
### Описание:
Эта функция не определена стандартом ANSI C.
Функция `kbhit()` возвращает истину, если нажата какая-либо клавиша на клавиатуре.
В противном случае возвращается 0.
В любом случае код клавиши не удаляется из входного буфера.
### Пример:
```c
/* Следующий фрагмент является циклом, выход из которого осуществляется по нажатию клавиши */
while(!kbhit()); /* ожидание нажатия клавиши */
```
## `int ungetch(int ch)`
### Описание:
Эта функция не определена стандартом ANSI С. Она не может использоваться в программах Windows.
Функция `ungetch()` возвращает символ, заданный младшим байтом `ch`,
обратно во входной буфер консоли.
При следующем обращении к функции ввода с консоли этот символ будет считан снова.
Между двумя последовательными операциями ввода может быть возвращен обратно только один символ.
Возвращаемое значение равно `ch` в случае успеха и `EOF` — при неудаче.
### Пример:
```c
/* Приведенная ниже программа вводит клавишу, отображает ее на экране,
затем возвращает ее во входной буфер, снова считывает и выводит на экран */
#include <stdio.h>
#include <conio.h>
int main() {
char ch;
ch = getch(); // получение нажатия
putch(ch); // вывод клавиши
ungetch(ch); // возврат в буфер
ch = getch(); // получение той же клавиши еще раз
putch(ch); // вывод клавиши еще раз
return 0;
}
```
## `int getch(void)` и `int getche(void)`
### Описание:
Функция `getch()` возвращает очередной символ, считанный с консоли,
но не выводит этот символ на экран.
Функция `getche()` возвращает очередной символ, считанный с консоли,
и выводит этот символ на экран.
Ни одна из этих функций не определена стандартом ANSI С.
### Пример:
```c
/* В этом фрагменте getch() используется
для считывания выбора пользователя для программы проверки орфографии */
do {
printf("1: Check spelling\n");
printf("2: Correct spelling\n");
printf("3: Look up a word in the dictionary\n");
printf("4: Quit\n");
printf("\nEnter your selection: ");
choice = getch();
} while(!strchr ("1234", choice));
```