Буферный ввод и вывод данных
В момент запуска программ на языке Си автоматически запускаются стандартный поток ввода(stdin), стандартный тоток вывода(stdout) и стандартный поток вывода сообщений об ошибках(stderr). Стандартный поток ввода stdin по умолчанию соответствует клавиатуре, а потоки stdout и stderr - экрану монитора.
Для ввода и вывода информации в этих потоках существует несколько функций:
-
getchar() ввод с клавиатуры одного символа
-
putchar() вывод на консоль одного символа
-
fgets() ввод одной строки
-
puts() / fputs() вывод одной строки на консоль
-
scanf() ввод с консоли с форматированием данных
-
sscanf() ввод с из строки с форматированием данных
-
printf() вывод с форматированием данных
Функции scanf() и printf() рассматривались в статье о вводе и выводе данных. В данной статье будут рассмотрены остальные функций.
Системные вызовы чтения или записи являются дорогими операциями и если оперировать одиночными символами, то такой код будет работать очень медленно. Поэтому, на практике, при операциях ввода-вывода выделяется специальная область временной памяти (буфер), куда сначала записываются поступающие символы, а как только поступает специальный сигнал(например, переход на новую строку при нажатии кнопки 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;
}
Самостоятельная работа
Задачи
Задача 1
Считайте строку и замените в ней все строчные английские буквы на заглавные.
Задача 2
Дана строка, состоящая из английских букв и цифр. Посчитайте сумму цифр в ней.
Задача 3
Дана строка, состоящая из английских букв и цифр. Составьте из цифр в данной строке одно число и поместите его в целочисленную переменную.
Задача 4
Дана строка, состоящая из английских букв и пробелов, в конце строки символ: точка. Удалите из строки все лишние пробелы.