Перейти к основному содержимому

Буферный ввод и вывод данных

В момент запуска программ на языке Си автоматически запускаются стандартный поток ввода(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

Дана строка, состоящая из английских букв и пробелов, в конце строки символ: точка. Удалите из строки все лишние пробелы.