Язык C++ не обладает средствами для ввода-вывода. Ему это и не нужно; подобные средства легко и элегантно можно создать, применяя сам язык. Стандартная библиотека потокового ввода-вывода дает возможность осуществлять гибкий и эффективный с гарантией
типа метод обработки символьного ввода целых чисел, чисел с плавающей точкой и символьных строк, кроме
того, простую модель ее расширения с целью обработки типов, определяемых пользователем. Разработка и осуществление стандартных средств
ввода-вывода для языка программирования является
заведомо трудной работой. Традиционно средства
ввода-вывода изобретались только для небольшого числа встроенных типов данных. Но в C++ программах
обычно применяется много типов, определенных
пользователем, и необходимо обрабатывать ввод
и вывод также и значений этих типов. Средство ввода-вывода должно являться простым, удобным, надежным в употреблении, эффективным и гибким и при
этом полным. Еще не удавалось угодить всем, поэтому у пользователя должна иметься возможность задавать альтернативные средства ввода-вывода
и увеличивать стандартные средства ввода-вывода применительно к требованиям приложения.
C++ устроен так, чтобы у пользователя имелась
возможность определять новые типы, такие же эффективные и удобные, сколь и встроенные типы.
Средства ввода-вывода связаны только с обработкой преобразования типизированных объектов в последовательности символов и обратно. Существуют и другие схемы ввода-вывода, но эта служит основополагающей в системе UNIX, и большая часть
видов бинарного ввода-вывода обрабатывается через
изучение символа просто как набор бит, при этом его
общепринятая связь с алфавитом не воспринимается.
Тогда ключевая проблема состоит в задании соответствия между типизированным объектом и принципиально не типизированной строкой.
Обработка как встроенных, так и определенных пользователем типов однородным образом и с гарантией ти-
па осуществляется при помощи одного перегруженного
имени функции для набора функций вывода.
К примеру:
put(cerr,»x = «); -- cerr — поток вывода ошибок
put(cerr,x);
put(cerr,»\n»);
Тип параметра устанавливает то, какая из функций
put будет вызываться для каждого параметра. Это решение использовалось в нескольких языках. Но ему не
хватает лаконичности. Перегрузка операции << значением «поместить в» дает лучшую запись и дает возможность программисту выводить несколько объектов
одним оператором. К примеру:
cerr << «x=» << x << « \n»;
где cerr представляет собой стандартный поток вывода ошибок.