322 Часть II. Программирование на C++

of stream out;

II... Некий код out. open ( '^AUTOEXEC.BAT");

if( !out) /'/ А каким образом operator! работает? // Открыть файл не удалось...

Точно так же обстоит дело для ifstream. Таким образом, открывать файл прямо при объявлении объекта файлового потока не обязательно.

Замечание

¦Видя операции в компании с пользовательскими объектами (например, объектами файловых потоков), насторожитесь: что-то происходит за кулисами. Речь сейчас идет об условном операторе

if( !out)

в только что приведенном примере. Одним из качественных достижений C++ явилась возможность адаптировать поведение оп.ераци^ к определяемым пользователями типам. Как это работает и как это делается, объяснено в главе 16 "Перегрузка операций". В данном случае разработчики классов файловых потоков приспособили функцию operator! (т.е. оператор-функцию!) для потоков.

Буферизуемые потоки

Объекты класса streambuf используются в качестве элементов классами более высокого уровня. Этот класс обеспечивает управление байтовыми массивами данных потоков файлового и консольного ввода-вывода.

Класс ios "содержится" в потоковых классах благодаря наследованию. Функция rdbuf(), определенная в классе ios, возвращает указатель на его элемент streambuf. На листинге 13.7 приведен пример, извлеченный из справочной системы Borland C++ для streambuf:

h03221.jpg

ttinclude <iostreain.h>

void main()

(

int c:

streambuf *input = cin.rdbuff); // rdbuf возвращает указатель на // элемент streambuf объекта cin

clog « "Введите любой текст. Закончив, нажмите Ctrl-Z" « endl;

while ( (с = input->sbumpc()) \= EOF) cout « char(с) ;

}