В момент запуска программ на языке Си автоматически запускаются стандартный поток ввода(stdin), стандартный тоток вывода(stdout) и стандартный поток вывода сообщений об ошибках(stderr). Стандартный поток ввода stdin по умолчанию соответствует клавиатуре, а потоки stdout и stderr - экрану монитора.
Для ввода и вывода информации в этих потоках существует несколько функций:
-
getchar(): ввод с клавиатуры одного символа
-
putchar(): вывод на консоль одного символа
-
fgets(): ввод одной строки
-
puts() / fputs(): вывод одной строки на консоль
-
scanf(): ввод с консоли с форматированием данных
-
sscanf(): ввод с из строки с форматированием данных
-
printf(): вывод с форматированием данных
Функции scanf() и printf() уже рассматривались на 4 уроке, поэтому остановимся на работе остальных функций.
Системные вызовы чтения или записи являются дорогими операциями и если оперировать одиночными символами, то такой код будет работать очень медленно. Поэтому, на практике, при операциях ввода-вывода выделяется специальная область временной памяти (буфер), куда сначала записываются поступающие символы, а как только поступает специальный сигнал(например, переход на новую строку при нажатии кнопки Enter), происходит один системный вызов cin/cout и данные из буфера передаются по месту своего назначения (на экран, в переменную и др.).
Ввод и вывод одиночных символов.
Для ввода и вывода одиночных символов используются макросы getchar() и putchar(), прописанные в заголовочном файле stdio.h:
#define getchar() getc(stdin)
#define putchar(c) putc((c), stdout)
Для вывода отдельного символа в стандартный поток вывода предназначена функция putchar() со следующим прототипом:
int putchar( int c);
Выводимый символ в виде числового кода передается в putchar в качестве параметра, он же возвращается функцией.
Для ввода одного символа с клавиатуры применяется макрос getchar(), который имеет следующий прототип:
int getchar( void );
В качестве результата функция возвращает числовой код введенного символа.
При использовании функции getchar следует учитывать, что напечатанные посредством клавиатуры символы, включая символ кнопки Enter, находятся в буфере операционной системы. Понять механизм работы getchar() проще на практическом примере:
#include <stdio.h>
int main( void )
{
printf("1");
getchar(); // ожидание ввода символа
printf("2");
getchar(); // ожидание ввода символа
printf("3");
return 0;
}
Ввод и вывод строк.
Вывести одну строку на консоль можно при помощи функции puts():
int putchar( char *s);
В качестве параметра передается указатель на выводимую строку. Функция либо возвращает ноль, означающий конец строки, либо ее результат будет неопределённым.
Также, для вывода строк можно использовать функцию fputs():
int fputs( const char *s, FILE *stream);
Первым параметром функция принимает ссылку на строку, а вторым - указатель на поток вывода(для записи в стандартный поток указывается параметр stdout). В качестве результата функция возвращает неотрицательное целое число. Если в процессе записи возникают ошибки, то возвращается значение EOF. Пример:
#include <stdio.h>
int
main(
void
)
{
fputs
(
"Hello World\n"
, stdout);
return
0;
}
Для ввода строки с клавиатуры можно использовать функцию fgets(), которая имеет следующий прототип:
char
*
fgets
(
char
*str,
int
count,
FILE
*stream);
Первый параметр функции - ссылка на буфер (на строку) куда будут записываться символы, второй - максимальное количество считываемых символов(Важно !!! Последний считываемый символ зарезервирован для символа перевода строки !!!), третий параметр - поток, из которого будут читаться символы(в качестве потока можно указать консольный ввод).
После нажатия клавиши Enter функция прекращает считывание и возвращает указатель на буфер, в который считаны данные, то есть на первый параметр функции. Если в процессе чтения произошла ошибка, то функция возвращает NULL.
#include <stdio.h>
#define MAX 15
int
main(
void
)
{
char
name[MAX];
printf
(
"Enter name: "
);
if
(
fgets
(name, MAX, stdin) != NULL)
// if(fgets(name, MAX, stdin)) - можно сократить
{
printf
(
"Your name: %s\n"
, name);
}
else
{
printf
(
"Critical Error!!!"
);
}
return
0;
}
Комментарии ()