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:
ttinclude <iostreain.h>
void main()
(
int c:
streambuf *input = cin.rdbuff); // rdbuf возвращает указатель на // элемент streambuf объекта cin
clog « "Введите любой текст. Закончив, нажмите Ctrl-Z" « endl;
while ( (с = input->sbumpc()) \= EOF) cout « char(с) ;
}