ГЛАВА 10. ПОТОКИ "Доступно только то, что видимо"
Б. Керниган В языке С++ нет средств для ввода-вывода. Их и не нужно, поскольку такие средства можно просто и
элегантно создать на самом языке. Описанная здесь библиотека потокового ввода-вывода реализует
строгий типовой и вместе с тем гибкий и эффективный способ символьного ввода и вывода целых,
вещественных чисел и символьных строк, а также является базой для расширения, рассчитанного на
работу с пользовательскими типами данных. Пользовательский интерфейс библиотеки находится в
файле . Эта глава посвящена самой потоковой библиотеке, некоторым способам работы с
ней и определенным приемам реализации библиотеки.
10.1 ВВЕДЕНИЕ Широко известна трудность задачи проектирования и реализации стандартных средств ввода-вывода
для языков программирования. Традиционно средства ввода-вывода были рассчитаны исключительно
на небольшое число встроенных типов данных. Однако, в нетривиальных программах на С++ есть
много пользовательских типов данных, поэтому необходимо предоставить возможность ввода-вывода
значений таких типов. Очевидно, что средства ввода-вывода должны быть простыми, удобными,
надежными в использовании и, что важнее всего, адекватными. Пока никто не нашел решения, которое
удовлетворило бы всех; поэтому необходимо дать возможность пользователю создавать иные средства
ввода-вывода, а также расширять стандартные средства ввода-вывода в расчете на определенное
применение.
Цель создания С++ была в том, чтобы пользователь мог определить новые типы данных, работа с
которыми была бы столь же удобна и эффективна как и со встроенными типами. Таким образом,
кажется разумным потребовать, чтобы средства ввода-вывода для С++ программировались с
использованием возможностей С++, доступных каждому. Представленные здесь потоковые средства
ввода-вывода появились в результате попытки удовлетворить этим требованиям.
Основная задача потоковых средств ввода-вывода - это процесс преобразования объектов
определенного типа в последовательность символов и наоборот. Существуют и другие схемы ввода-
вывода, но указанная является основной, и если считать символ просто набором битов, игнорируя его
естественную связь с алфавитом, то многие схемы двоичного ввода-вывода можно свести к ней.
Поэтому программистская суть задачи сводится к описанию связи между объектом определенного типа
и бестиповой (что существенно) строкой.
Последующие разделы описывают основные части потоковой библиотеки С++:
10.2 Вывод: То, что для прикладной программы представляется выводом, на самом деле является
преобразованием таких объектов как int, char *, complex или Employee_record в
последовательность символов. Описываются средства для записи объектов встроенных и
пользовательских типов данных.
10.3 Ввод: Описаны функции для ввода символов, строк и значений встроенных и
пользовательских типов данных.
10.4 Форматирование: Часто существуют определенные требования к виду вывода, например, int
должно печататься десятичными цифрами, указатели в шестнадцатеричной записи, а
вещественные числа должны быть с явно заданной точностью фиксированного размера.
Обсуждаются функции форматирования и определенные программистские приемы их
создания, в частности, манипуляторы.
10.5 Файлы и потоки: Каждая программа на С++ может использовать по умолчанию три потока -
стандартный вывод (cout), стандартный ввод (cin) и стандартный поток ошибок (cerr). Чтобы
работать с какими-либо устройствами или файлами надо создать потоки и привязать их к этим
устройствам или файлам. Описывается механизм открытия и закрытия файлов и связывания
файлов с потоками.
10.6 Ввод-вывод для С: обсуждается функция printf из файла для С а также связь между
Бьерн Страуструп.
Язык программирования С++
258
библиотекой для С и для С++.
Укажем, что существует много независимых реализаций потоковой библиотеки ввода-вывода и набор
средств, описанных здесь, будет только подмножеством средств, имеющихся в вашей библиотеке.
Говорят, что внутри любой большой программы есть маленькая программа, которая стремится
вырваться наружу. В этой главе предпринята попытка описать как раз маленькую потоковую библиотеку
ввода-вывода, которая позволит оценить основные концепции потокового ввода-вывода и познакомить
с наиболее полезными средствами. Используя только средства, описанные здесь, можно написать
много программ; если возникнет
необходимость в более сложных средствах, обратитесь за деталями к вашему руководству по С++.
Заголовочный файл определяет интерфейс потоковой библиотеки. В ранних версиях
потоковой библиотеки использовался файл . Если существуют оба файла, определяет полный
набор средств, а определяет подмножество, которое совместимо с ранними, менее
богатыми потоковыми библиотеками.
Естественно, для пользования потоковой библиотекой вовсе не нужно знание техники ее реализации,
тем более, что техника может быть различной для различных реализаций. Однако, реализация ввода-
вывода
является задачей, диктующей определенные условия, значит приемы, найденные в процессе ее
решения, можно применить и для других задач, а само это решение достойно изучения.