Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
c++book1.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2 Мб
Скачать
☆

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 определе­на операция <<, и пользователь может определять операцию << для нового типа.

8.2 Вывод

В этом разделе сначала обсуждаются средства форматного и бесформатного вывода встроенных типов, потом приводится стан­дартный способ спецификации действий вывода для определяемых пользователем типов.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]