Связывание потоков ввода-вывода. Нежесткое связывание функцией 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);

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



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий