setlocale ( LC_ALL , ".1251" ) ; /* печать русских текстов */
fn( cout ) ;
system( "PAUSE" ) ; return 0 ;
}
Программа передаёт функции fn( )
поток cout. Функция использует оператор operator<<( ). Сначала С++ определит, что левый аргумент имеет тип ostream, а правый — тип char*. Вооружённый этими знаниями, он найдёт прототип функции operator<<( ostream& , char* ) в заголовочном файле iostream. Затем С++ вызовет функцию вставки в поток для char*, передавая ей строку "Меня зовут Стефан\n" и объект cout в качестве аргументов. Другими словами, он вызовет функцию operator<<( cout , "Меня зовут Стефан\n" ). Функция для вставки char* в поток, которая является частью стандартной библиотеки С++, выполнит необходимый вывод.Но откуда компилятору известно, что cout
является объектом класса ostream? Этот и ещё несколько глобальных объектов объявлены в файле iostream.h ( их список приведён в табл. 24.1 ). Эти объекты автоматически конструируются при запуске программы, до того как main( ) получает управление.
Таблица 24.1. Стандартные потоки ввода-вывода
_________________
Объект — Класс — Назначение
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
cin — istream —
Стандартный ввод cout — ostream —
Стандартный вывод cerr — ostream —
Стандартный небуферизованный вывод сообщений об ошибках clog — ostream —
Стандартный буферизованный вывод сообщений об ошибках ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
►Знакомство с подклассами fstream...278
Подклассы ofstream
, ifstream и fstream объявлены в заголовочном файле fstream.h и обеспечивают потоки ввода-вывода в дисковые файлы. Эти три класса предоставляют множество функций для управления вводом и выводом, многие из которых наследуются от ostream и istream. Полный список этих функций вы можете найти в документации к компилятору, а здесь я приведу только несколько из них, чтобы вы могли с чего-то начать. _________________
278 стр. Часть 5
. Полезные особенности
Класс ofstream
, который используется для файлового вывода, имеет несколько конструкторов; наиболее часто применяется следующий:
ofstream::ofstream( char* pFileName ,
int mode = ios::out ,
int prot = filebuff::openprot ) ;
Первый аргумент этого конструктора — указатель на имя открываемого файла. Второй и третий аргументы определяют, как именно должен быть открыт файл. Корректные значения аргумента mode
приведены в табл. 24.2, a prot — в табл. 24.3. Эти значения являются битовыми полями, к которым применяется оператор побитового ИЛИ ( классы ios и filebuff — родительские по отношению к ostream ).
«Выражение
ios::out представляет статический член-данные класса ios.»[
Советы]
Таблица 24.2. Значения аргумента mode в конструкторе класса ofstream
_________________
Флаг — Назначение
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
ios::app
— Дописывать в конец файла. Вернуть ошибку, если файл не существует ios::ate
— Дописывать в конец файла, если он существует ios::in
— Открыть файл для ввода ( подразумевается для istream ) ios::out
— Открыть файл для вывода ( подразумевается для ostream ) ios::trunc
— Обрезать файл до нулевой длины, если он существует ( используется по умолчанию ) ios::nocreate
— Если файла не существует, вернуть сообщение об ошибке ios::noreplace
— Если файл существует, вернуть сообщение об ошибке ios::binary
— Открыть файл в бинарном режиме ( альтернатива текстовому режиму ) ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Таблица 24.3. Значения аргумента prot в конструкторе класса ofstream
_________________
Флаг — Назначение
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯