logo
шпоры по ООП

45.Последовательность действий при создании ostream.

Потоки обычно связаны с файлами. Библиотека потоков создает стандартный поток ввода cin, стандартный поток вывода cout и стандартный поток ошибок cerr. Программист может открывать другие файлы и создавать для них потоки.

Инициализация Потоков Вывода

ostream имеет конструкторы:

class ostream {

// ...

ostream(streambuf* s); // связывает с буфером потока

ostream(int fd); // связывание для файла

ostream(int size, char* p); // связывет с вектором

};

Главная работа этих конструкторов - связывать с потоком буфер. streambuf - класс, управляющий буферами; он описывается в #8.6, как и класс filebuf, управляющий streambuf для файла. Класс filebuf является производным от класса streambuf.

Описание стандартных потоков вывода cout и cerr, которое находится в исходных кодах библиотеки потоков ввода/вывода, выглядит так:

// описать подходящее пространство буфера

char cout_buf[BUFSIZE]

// сделать \"filebuf\" для управления этим пространством

// связать его с UNIX\"овским потоком вывода 1 (уже открытым)

filebuf cout_file(1,cout_buf,BUFSIZE);

// сделать ostream, обеспечивая пользовательский интерфейс

ostream cout(&cout_file);

char cerr_buf[1];

// длина 0, то есть, небуферизованный

// UNIX\"овский поток вывода 2 (уже открытый)

filebuf cerr_file()2,cerr_buf,0;

ostream cerr(&cerr_file);

Закрытие Потоков Вывода

Деструктор для ostream сбрасывает буфер с помощью открытого члена функции ostream::flush():

ostream::~ostream()

{

flush(); // сброс

}

Сбросить буфер можно также и явно. Например:

cout.flush();

Для файлов

Последовательность действий при создании ostream для именованного файла та же, что используется для стандартных потоков: (1) сначала создается буфер (здесь это делается посредством описания filebuf); (2) затем к нему подсоединяется файл (здесь это делается посредством открытия файла с помощью функции filebuf::open()); и, наконец, (3) создается сам ostream с filebuf в качестве параметра. Потоки ввода обрабатываются аналогично.