std::basic_ios<CharT,Traits>::tie
Von cppreference.com
| std::basic_ostream<CharT, Traits>* tie() const; |
(1) | |
| std::basic_ostream<CharT, Traits>* tie( std::basic_ostream<CharT, Traits>* str ); |
(2) | |
Verwaltet den gekoppelten Stream. Ein gekoppelter Stream ist ein Ausgabestream, der mit der vom Stream-Puffer gesteuerten Sequenz synchronisiert ist (rdbuf()), das heißt, flush() wird auf dem gekoppelten Stream aufgerufen, bevor eine Ein-/Ausgabeoperation auf *this stattfindet.
1) Gibt den aktuellen gekoppelten Stream zurück. Wenn kein gekoppelter Stream vorhanden ist, wird ein Nullzeiger zurückgegeben.
2) Setzt den aktuellen gekoppelten Stream auf str. Gibt den gekoppelten Stream vor der Operation zurück. Wenn kein gekoppelter Stream vorhanden ist, wird ein Nullzeiger zurückgegeben. Wenn str nicht null ist und tie() durch Durchlaufen der verknüpften Liste von gekoppelten Stream-Objekten, beginnend bei str->tie(), erreichbar ist, ist das Verhalten undefiniert.
Inhalt |
[bearbeiten] Parameter
| str | - | Ein Ausgabestream, der als gekoppelter Stream gesetzt werden soll. |
[bearbeiten] Rückgabewert
Der gekoppelte Stream oder ein Nullzeiger, falls kein gekoppelter Stream vorhanden war.
[edit] Exceptions
Kann implementierungsdefinierte Ausnahmen auslösen.
[bearbeiten] Hinweise
Standardmäßig ist der Standardstream std::cout mit std::cin und std::cerr gekoppelt. Ebenso ist sein Wide-Counterpart std::wcout mit std::wcin und std::wcerr gekoppelt.
[bearbeiten] Beispiel
Führen Sie diesen Code aus
#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"; }
Ausgabe
Result before tie(): "0" Result after tie(): "Hello"
[bearbeiten] Defect Reports
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 835 | C++98 | Zwei Streams könnten miteinander gekoppelt sein[1] (direkt oder über ein anderes zwischengeschaltetes Stream-Objekt) |
das Verhalten ist in diesem Fall undefiniert |
- ↑ std::basic_ostream::flush() ist eine UnformattedOutputFunction, daher erstellt sie beim Aufruf ein Sentry-Objekt. Wenn
flush()auf einem Stream-Objekt aufgerufen wird, ruft der Konstruktor des Sentry-Objektsflush()auf seinem gekoppelten Stream auf, und diesesflush()erstellt ein weiteres Sentry-Objekt, und dessen Konstruktor ruftflush()auf dem gekoppelten Stream dieses Streams usw. auf. Daher führt ein Aufruf von a.flush(), wenn die Streams a und b (direkt oder indirekt) miteinander gekoppelt sind, schließlich zu einem Aufruf von b.flush(), was schließlich zu einem Aufruf von a.flush() führt und eine Endlosschleife zur Folge hat.