Namensräume
Varianten
Aktionen

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

Von cppreference.com
< cpp‎ | io‎ | basic ios
 
 
 
 
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

#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
  1. 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-Objekts flush() auf seinem gekoppelten Stream auf, und dieses flush() erstellt ein weiteres Sentry-Objekt, und dessen Konstruktor ruft flush() 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.