# 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,[encoded data, 31688 characters])

При установке значения 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));
```
