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