Страница 1 из 10
Потоки
Язык С++ не обеспечивает средств для ввода/вывода. Ему это и не нужно. Такие средства легко и элегантно можно создать с помощью самого языка. Описанная здесь стандартная библиотека потокового ввода/вывода обеспечивает гибкий и эффективный, с гарантией типа, метод обработки символьного ввода целых чисел, чисел с плавающей точкой и символьных строк, а также простую модель ее расширения для обработки типов, определяемых пользователем. Ее пользовательский интерфейс находится в «stream.h». В этой главе описывается сама библиотека, некоторые способы ее применения и методы, которые использовались при ее реализации.
8.1 Введение
Разработка и реализация стандартных средств ввода/вывода для языка программирования зарекомендовала себя как заведомо трудная работа. Традиционно средства ввода/вывода разрабатывались исключительно для небольшого числа встроенных типов данных. Однако в С++ программах обычно используется много типов, определяемых пользователем, и нужно обрабатывать ввод и вывод также и значений этих типов. Очевидно, средство ввода/вывода должно быть простым, удобным, надежным в употреблении, эффективным и гибким, и ко всему прочему полным. Ничье решение еще не смогло угодить всем, поэтому у пользователя должна быть возможность задавать альтернативные средства ввода/вывода и расширять стандартные средства ввода/вывода применительно к требованиям приложения.
С++ разработан так, чтобы у пользователя была возможность определять новые типы столь же эффективные и удобные, сколь и встроенные типы. Поэтому обоснованным является требование того, что средства ввода/вывода для С++ должны обеспечиваться в С++ с применением только тех средств, которые доступны каждому программисту. Описываемые здесь средства ввода/ вывода представляют собой попытку ответить на этот вызов.
Средства ввода/вывода «stream.h» связаны исключительно с обработкой преобразования типизированных объектов в последовательности символов и обратно. Есть и другие схемы ввода/ввода, но эта является основополагающей в системе UNIX, и большая часть видов двоичного ввода/вывода обрабатывается чрез рассмотрение символа просто как набора бит, при этом его общепринятая связь с алфавитом игнорируется. Тогда для программиста ключевая проблема заключается в задании соответствия между типизированным объектом и принципиально не типизированной строкой.
Обработка и встроенных и определяемых пользователем типов однородным образом и с гарантией типа достигается с пмощью одного перегруженного имени функции для набора функций вывода. Например:
put(cerr,"x = «); // cerr – поток вывода ошибок put(cerr,x); put(cerr,»\n");
Тип параметра определяет то, какая из функций put будет вызываться для каждого параметра. Это решение применялось в нескольких языках. Однако ему недостает лаконичности. Перегрузка операции «„ значением «поместить в“ дает более хорошую
запись и позволяет программисту выводить ряд объектов одним оператором. Например:
cerr «„ "x = " «« x «« «\n“;
где cerr – стандартный поток вывода ошибок. Поэтому, ели x является int со значением 123, то этот оператор напечтает в стандартный поток вывода ошибок
x = 123
и символ новой строки. Аналогично, если X принадлежит определенному пользователем типу complex и имеет значение (1, 2.4), то приведенный выше оператор напечатает в cerr
x = (1,2.4)
Этот метод можно применять всегда, когда для x определена операция ««, и пользователь может определять операцию «« для нового типа.
|