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.
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] (прямо или через другой промежуточный объект потока) | поведение в этом случае не определено |
-
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