Все эти функции читают символ из системы ввода (например консоль терминала) и возвращают соответствующее им целочисленное значение. Возвращаемое значение может быть специальным для индикации ошибки. Значение EOF также является специальным, используемым для той же цели.
getc. Читает один символ из потока ввода и в случае успеха возвратит соответствующее целочисленное значение (обычно значение кода символа ASCII). В случае ошибки будет возвращен символ EOF.
Функция getc блокирующая, т. е. из неё не будет произведен возврат, пока из потока ввода stream не поступит символ.
Синтаксис:
int getc(FILE *stream);
В следующем примере показано чтение из стандартного ввода (клавиатура). В этом случае возврат из getc не произойдет, пока не будет нажата клавиша Enter. На выходе будет возвращен первый введенный символ, остальные, которые нажаты до Enter, будут потеряны. Нажатие Ctrl+C прервет работу функции.
#include < stdio.h>
int main()
{
printf("%c", getc(stdin));
return (0);
}
Результат выполнения:
Ввод: g (и нажатие на Enter) Вывод: g
Нажатие Ctrl+C прервет работу программы, при этом функция не успеет возвратить значение, чтобы оно было выведено оператором printf.
getchar. Отличия между getc() и getchar() в том, что getc() может прочитать символ из любого потока ввода, но getchar() читает символ только из стандартного ввода. Таким образом, для консольного приложения в контексте клавиатурного ввода getchar() является эквивалентом getc(stdin).
Синтаксис:
int getchar(void);
Пример использования на C:
#include < stdio.h>
int main()
{
printf("%c", getchar());
return 0;
}
Результат работы:
Ввод: g (и нажатие на Enter) Вывод: g
Очевидно, что этот пример с вызовом getchar() работает так же, как и предыдущий с вызовом getc(stdin).
getch. Как и предыдущая getchar(), функция getch() также считывает символ из клавиатуры. Однако она не использует никакой буфер, так что введенный символ не отобразится на экране, и будет немедленно возвращен без ожидания нажатия на клавишу Enter.
Синтаксис:
int getch();
Функция getch() не относится к стандартным функциям ввода/вывода (описанным в stdio.h), и её определение находится в заголовке conio.h. Этот заголовочный файл в основном используется в компиляторах MS-DOS, такими как Turbo C. Он не является частью стандартной библиотеки C или ISO C, и не определен стандартом POSIX. Таким образом, следующий пример не может быть скомпилирован в Linux. Чтобы добиться поведения консоли, аналогичного функции getch, необходимо поменять режим работы терминала с помощью вызовов tcgetattr(), tcsetattr() (см. далее).
Пример использования на C:
#include < conio.h> #include < stdio.h>
int main()
{
printf("%c", getch());
return 0;
}
Результат выполнения:
Ввод: g (без клавиши Enter) Вывод: программа немедленно завершится. Однако когда вы используете DOS-шелл в Turbo C, будет показан один символ, т. е. 'g'.
getche. Функция getche() прочитает один символ из клавиатуры и отобразит его немедленно на экране вывода без ожидания клавиши Enter. Как и функция getch(), она также является нестандартной, и присутствует в заголовке conio.h.
Синтаксис:
int getche(void);
Пример программы на C:
#include < conio.h> #include < stdio.h>
int main()
{
printf("%c", getche());
return 0;
}
Результат работы:
Ввод: g (без клавиши Enter) Вывод: программа завершится немедленно. В DOS-шелл Turbo C будет выведено 2 символа g, т. е. 'gg'.
[Аналог функции getch() в Linux]
Ниже приведен код функций disable_console_canonical() и restore_console_settings(). Первая из них установит режим консоли таким образом, что функция getchar() будет работать аналогично функции getch(), т. е. будет сразу делать возврат введенного символа без ожидания клавиши Enter. Вторая функция, restore_console_settings(), восстановит предыдущие настройки консоли.
#include < stdlib.h> #include < stdio.h> #include < termios.h> #include < string.h>
static struct termios stored_settings;
void disable_console_canonical (void)
{
struct termios new_settings;
tcgetattr(0, &stored_settings);
new_settings = stored_settings;
// Запрет "каноничного" режима и установка размера буфера в 1 байт:
new_settings.c_lflag &= (~ICANON);
new_settings.c_cc[VTIME] = 0;
new_settings.c_cc[VMIN] = 1;
tcsetattr(0, TCSANOW, &new_settings);
return;
}
void restore_console_settings (void)
{
tcsetattr(0, TCSANOW, &stored_settings);
return;
}
Подробно про использование этих функций см. [2].
[Ссылки]
1. Difference between getc(), getchar(), getch() and getche() site:geeksforgeeks.org. 2. Unix Programming FAQ site:opennet.ru. 3. getch and arrow codes site:stackoverflow.com. 4. Linux: как добиться не блокирующего ввода/вывода консоли. 5. FAQ программирования Linux: ввод/вывод терминала. |