Как устроен ввод и вывод в языке Си. Потоки ввода и вывода
Разберёмся, как устроен ввод и вывод данных в языке Си.
Помните в программе "Hello, World!" мы подключили заголовочный файл stdio.h
, чтобы пользоваться стандартной функцией printf()
? Так вот, кроме этой функции файл stdio.h
содержит множество других функций для ввода и вывода данных и прочих полезных штук. Но нас сейчас интересуют не все эти функции, а стандартные потоки ввода и вывода, которые там определены: стандартный поток ввода — stdin
и стандартный поток вывода — stdout
.
Что ещё за потоки? Чтобы лучше это понять, думайте о них, как о последовательности символов.
Следующая картинка иллюстрирует работу потоков:

Рис.1 Схема взаимодействия программы с потоками ввода и вывода
Стандартный поток ввода называется stdin
(от standard input) и обычно связан с клавиатурой, а стандартный поток вывода stdout
(standard output) — с экраном терминала (консоли). Я говорю обычно, потому что есть возможность перенаправить эти потоки, т.е. сделать так, чтобы данные выводились не на экран, а в какой-нибудь файл или получать данные не с клавиатуры, а из файла.
Фактически наша программа работает именно с этими потоками и не особо заморачивается о том, с чем конкретно они связаны (файл, экран терминала, клавиатура). Для программы главное, что данные приходят из стандартного потока ввода, а отправлять их надо в стандартный поток вывода. Всё остальное — забота операционной системы.
Т.е. когда мы в программе "Hello, World!" вызывали функцию printf("Hello, World!\n")
, то более точно было бы сказать, что функция отправила эту строку не на экран консоли, а в стандартный поток вывода, который связан с экраном консоли и поэтому строка появлялась на экране.

Рис. 2 Пример работы потока вывода в программе Hello, World!
Подведём итог:
Потоки в Си — это такая абстрактная модель для взаимодействия программ с данными. Программа не знает, откуда приходят данные (клавиатура, файл) или куда отправляются данные (экран, файл). Она просто читает данные из потока ввода (stdin) и записывает данные в поток вывода (stdout), а за взаимодействие с клавиатурой или экраном терминала отвечает операционная система.
Дополнительные материалы
- Кроме стандартных потоков ввода и вывода в заголовочном файле
stdio.h
определён ещёstderr
— стандартный поток ошибок. Его используют для вывода сообщений об ошибках и различных диагностических сообщений. У него есть свои особенности, которых мы не будет касаться, т.к. не будем использоватьstderr
.