Шаг 498.
Библиотека STL. Ввод-вывод с использованием потоковых классов. Связывание потоков ввода-вывода. Нежесткое связывание функцией tie

    На этом шаге мы рассмотрим реализацию нежесткого связывания потоков ввода-ывода.

    Иногда перед программистом возникает задача связывания двух потоков данных. Предположим, вы хотите, чтобы перед вводом данных на экран выводился текст с запросом на ввод. Другой пример - чтение и запись в одном потоке данных (это относится в основном к файлам). Третий характерный пример - выполнение операций с потоком данных в разных форматах. Все эти примеры будут рассмотрены далее.

Нежесткое связывание функцией tie

    При связывании потока с выходным потоком данных их буферы синхронизируются так, что содержимое буфера выходного потока данных будет очищаться функцией flush() перед любой операцией ввода или вывода в другом потоке данных. В таблице 1 перечислены функции связывания потоков данных, определенные в классе basic_ios.

Таблица 1. Связывание потоков данных
Функция Описание
tie() Возвращает указатель на выходной поток, связанный с данным потоком
tie(ostream* strm) Связывает поток с входным потоком, заданным аргументом, и возвращает указатель на предыдущий связанный входной поток (если он был)

    Вызов функции tie() без аргументов возвращает указатель на текущий выходной поток данных, связанный с данным потоком. Чтобы связать поток данных с новым выходным потоком, следует передать указатель иа этот выходной поток в аргументе tie(). Аргумент является указателем, поскольку в нем также может передаваться 0 (или NULL) для разрыва связи с выходным потоком данных. Каждый поток данных в любой момент времени может быть связан только с одним выходным потоком, но один выходной поток может быть связан с несколькими потоками данных.

    По умолчанию этот механизм используется для связывания стандартного входного потока данных со стандартным выходным потоком:

// Стандартные связи: 
std::cin.tie (&std:;cout); 
std::wcin.tie (&std::wcout);

    Тем самым гарантируется, что сообщение с запросом на ввод будет выведено из буфера перед операцией ввода. Например, при выполнении следующего фрагмента перед чтением х для cout будет автоматически вызвана функция flush():

std::cout << "Задайте x: "; 
std::cin >> x;

    Чтобы разорвать связь между потоками данных, передайте 0 или NULL при вызове tie(). Пример:

// Отсоединение cin от выходных потоков 
std::cin::tie (static_cast<std::ostream*>(0));

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

    Выходной поток данных также можно связать с другим выходным потоком. Например, следующая команда указывает, что перед выводом каких-либо данных в сеrr необходимо очистить буфер стандартного выходного потока данных:

// Связывание cout с сеrr 
сеrr.tie (&cout);

    На следующем шаге мы рассмотрим реализацию жесткого связывания.




Предыдущий шаг Содержание Следующий шаг