На этом шаге мы рассмотрим реализацию нежесткого связывания потоков ввода-ывода.
Иногда перед программистом возникает задача связывания двух потоков данных. Предположим, вы хотите, чтобы перед вводом данных на экран выводился текст с запросом на ввод. Другой пример - чтение и запись в одном потоке данных (это относится в основном к файлам). Третий характерный пример - выполнение операций с потоком данных в разных форматах. Все эти примеры будут рассмотрены далее.
При связывании потока с выходным потоком данных их буферы синхронизируются так, что содержимое буфера выходного потока данных будет очищаться функцией flush() перед любой операцией ввода или вывода в другом потоке данных. В таблице 1 перечислены функции связывания потоков данных, определенные в классе basic_ios.
Функция | Описание |
---|---|
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);
На следующем шаге мы рассмотрим реализацию жесткого связывания.