Spec-Zone.ru › C++

std::basic_ios<CharT,Traits>::tie

std::basic_ostream<CharT, Traits>* tie() const;
(1)
std::basic_ostream<CharT, Traits>* tie( std::basic_ostream<CharT, Traits>* str );
(2)

Управляет связанным потоком. Связанный поток — это выходной поток, синхронизированный с последовательностью, управляемой буфером потока (rdbuf()), то есть перед любой операцией ввода-вывода над *this для связанного потока вызывается flush().

1) Возвращает текущий связанный поток. Если связанного потока нет, возвращается нулевой указатель.
2) Устанавливает str в качестве текущего связанного потока. Возвращает поток, связанный до выполнения операции. Если связанного потока нет, возвращается нулевой указатель. Если str не равен null и tie() достижим при обходе связанного списка объектов связанных потоков, начиная с str->tie(), поведение не определено.

Параметры

str - выходной поток, который нужно установить в качестве связанного потока

Возвращаемое значение

Связанный поток или нулевой указатель, если связанного потока не было.

Исключения

Могут быть выброшены исключения, определяемые реализацией.

Примечания

По умолчанию стандартный поток std::cout связан с std::cin и std::cerr. Аналогично, его широкосимвольный аналог std::wcout связан с std::wcin и std::wcerr.

Пример

#include <fstream>
#include <iomanip>
#include <iostream>
#include <string>

int main()
{
    std::ofstream os("test.txt");
    std::ifstream is("test.txt");
    std::string value("0");
    
    os << "Hello";
    is >> value;
    
    std::cout << "Result before tie(): " << std::quoted(value) << "\n";
    is.clear();
    is.tie(&os);
    
    is >> value;
    
    std::cout << "Result after tie(): " << std::quoted(value) << "\n";
}

Вывод:

Result before tie(): "0"
Result after tie(): "Hello"

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.

DR Применяется к Поведение согласно опубликованной версии Правильное поведение
LWG 835 C++98 два потока могли быть связаны друг с другом[1]
(непосредственно или через другой промежуточный объект потока)
в этом случае поведение не определено
  1. std::basic_ostream::flush() является функцией вывода без форматирования, поэтому при вызове создаёт объект sentry. Когда flush() вызывается для объекта потока, конструктор объекта sentry вызывает flush() для связанного с ним потока, а этот flush() создаёт другой объект sentry, конструктор которого вызывает flush() для связанного потока этого потока, и так далее. Поэтому, если потоки a и b связаны друг с другом (непосредственно или косвенно), вызов a.flush() в итоге приведёт к вызову b.flush(), который в свою очередь приведёт к вызову a.flush(), что вызовет бесконечный цикл.

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/basic_ios/tie

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API