►Как работают потоки ввода-вывода...277
Потоки ввода-вывода основаны на перегруженных операторах operator>>( ) и operator<<( ). Объявления этих операторов находятся в заголовочном файле iostream, который мы включаем во все программы в данной книге. Коды этих функций находятся в стандартной библиотеке, с которой компонуются ваши программы. Вот листинг некоторых прототипов из файла iostream.
/* Операторы для ввода: */
istream& operator>>( istream& source , char* pDest ) ;
istream& operator>>( istream& source , int& dest ) ;
istream& operator>>( istream& source , char& dest ) ;
/* ...и так далее... */
/* Операторы для вывода: */
istream& operator<<( ostream& dest , char* pSource ) ;
istream& operator<<( ostream& dest , int& source ) ;
stream& operator<<( ostream& dest , char& source ) ;
/* ...и так далее... */
Оператор operator>>( ) называется оператором извлечения из потока, а operator<<( ) — оператором вставки в поток. Класс istream является базовым для ввода информации из файла или устройства ввода типа клавиатуры. При запуске программы на выполнение С++ открывает объект cin класса istream. Аналогично, ostream представляет собой базовый класс для файлового вывода, a cout — объект класса ostream по умолчанию.
_________________
277 стр. Глава 24. Использование потоков ввода-вывода
«Рассмотрим, что получится, если написать следующий код ( имеющийся на прилагаемом компакт-диске ).»
[Диск]
/* DefaultStreamOutput */
#include <iostream>
#include <cstdlib >
using namespace std ;
void fn( ostream& out )
{
out << "Меня зовут Стефан " ;
}
int main( int nNumberofArgs , char* pszArgs[ ] )
{
setlocale ( LC_ALL , ".1251" ) ; /* печать русских текстов */
fn( cout ) ;
system( "PAUSE" ) ; return 0 ;
}
Программа передаёт функции fn( ) поток cout. Функция использует оператор operator<<( ). Сначала С++ определит, что левый аргумент имеет тип ostream, а правый — тип char*. Вооружённый этими знаниями, он найдёт прототип функции operator<<( ostream& , char* ) в заголовочном файле iostream. Затем С++ вызовет функцию вставки в поток для char*, передавая ей строку "Меня зовут Стефан " и объект cout в качестве аргументов. Другими словами, он вызовет функцию operator<<( cout , "Меня зовут Стефан " ). Функция для вставки char* в поток, которая является частью стандартной библиотеки С++, выполнит необходимый вывод.
Но откуда компилятору известно, что cout является объектом класса ostream? Этот и ещё несколько глобальных объектов объявлены в файле iostream.h ( их список приведён в табл. 24.1 ). Эти объекты автоматически конструируются при запуске программы, до того как main( ) получает управление.
Таблица 24.1. Стандартные потоки ввода-вывода
_________________
Объект — Класс — Назначение
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
cin — istream — Стандартный ввод
cout — ostream — Стандартный вывод
cerr — ostream — Стандартный небуферизованный вывод сообщений об ошибках
clog — ostream — Стандартный буферизованный вывод сообщений об ошибках
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Больше книг — больше знаний!
Заберите 20% скидку на все книги Литрес с нашим промокодом
ПОЛУЧИТЬ СКИДКУ