Программирование на C и C++

Онлайн справочник программиста на C и C++

Чтение и запись символов

Простейшей из стандартных функций ввода/вывода на консоль является getchar(), читающая символ с клавиатуры, и putchar() печатающая символ на экран в текущей позиции курсора. Тем не неменее getchar() имеет некоторые существенные ограничения, описываемые ниже. Поэтому большую часть времени мы будем использовать getche(), когда будет потребность в чтении символа. Функцию getche() определила фирма Borland (в стандарте ANSI С ее нет). Хотя это довольно, типичное расширение, функция «может не поддерживаться в других средах. getche() ожидает нажатия клавиши, а затем возвращает значение. Нажатие клавиши также приводит к выводу символа на экран. Ниже показаны прототипы функций getche() и putchar():

int getche(void);

int putchar(int cb);


Функция getche() возвращает нажатый символ. Функция putchar() возвращает cb в случае успеха или EOF - в случае ошибки. (EOF - это макроопределение, находящееся в stdio.h, означающее конец файла.) Хотя cb объявлена как целое, на экран выводится только младший байт. Аналогично, хотя getche() возвращает целое, только младший байт будет содержать символ, введенный с клавиатуры. Функция getche() требует заголовочный файл conio.h.

Следующая программа вводит символы с клавиатуры и выводит их в противоположном регистре. То есть прописные буквы будут выведены строчными, а строчные - прописными. Программа останавливается при обнаружении точки.

/* переключатель регистра */
#include <conio.h>
#include <stdio.h>
#include <ctype.h>
int main(void) {
char ch;
do {
ch = getche();
if(islower(ch)) putchar(toupper(ch));
else putchar (tolower(ch));
} while (ch!='.'); /* использование точки для остановки */
return 0;
}

Существуют две важные альтернативы getche(). Первая - это getchar(), упомянутая ранее, являющаяся функцией ввода символов, определенная в ANSI С. Проблема, связанная с getchar(), заключается том, что она буферизирует ввод, пока не встретится возврат каретки. Причина этого заключается в системе ввода, реализованной в UNIX. В ней требуется ввести символ возврат каретки перед набором чего угодно, что требуется послать на компьютер. Для совместимости с UNIX многие компиляторы С включая Borland, имеют getchar() для такого ввода. Можно немного помучить данную функцию для лучшего понимания эффекта.

Следующей, более полезной вариацией getche() является getch(), которая действует подобно getche(), за тем исключением, что она не выводит символ на экран. Можно использовать этот факт для создания программ-розыгрышей ничего не подозревающих пользователей. Программа показанная ниже, выводит стандартную подсказку операционной системы и ожидает ввода. Каждый символ, вводимый пользователем, отображается следующей буквой алфавита. То есть «А» станет «В» и так далее. Для остановки программы нажмите CTRL-A.

/* данная программа выглядит так же, как подсказка командной строки. Она выводит подсказку, но каждый введенный пользователем символ заменяется на следующий символ алфавита*/

#include <stdio.h>
#include <conio.h>
int main(void)
{
char ch;
do {
printf("С:\");
for(;;)
{
ch = getch(); /* чтение символов без эха */
if(ch=='\r' || ch==1)
{
printf("\n");
break;
}
putchar(ch+1);
}
} while(ch!=1); /* выход no control-A */
return 0;
}

Хотя эта программа не имеет никаких применений, кроме шуток, функция getch() имеет достаточно широкое применение. Например, ее можно использовать для ввода пароля без вывода символов на экран.