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()), то есть, flush() вызывается на привязанном потоке перед любой операцией ввода/вывода на *this.

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

Параметры

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

Значение возврата

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

Исключения

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

Примечания

По умолчанию стандартный поток 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() является Функцией неформатированного вывода, поэтому при вызове создаёт объект-сторож. При вызове flush() на объекте потока конструктор объекта-сторожа вызовет flush() на привязанном потоке, и этот flush() создаст другой объект-сторожа, и его конструктор вызовет 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/w/cpp/io/basic_ios/tie

Spec-Zone.ru

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