名前空間
変種
操作

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

From 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)

連結されたストリームを管理します。連結されたストリームとは、ストリームバッファ (rdbuf()) によって制御されるシーケンスと同期している出力ストリームのことです。つまり、*this に対するあらゆる入出力操作の前に、連結されたストリームで flush() が呼び出されます。

1) 現在連結されているストリームを返します。連結されているストリームがない場合は、ヌルポインタを返します。
2) 現在連結されているストリームを str に設定します。操作前の連結されていたストリームを返します。連結されていたストリームがない場合は、ヌルポインタを返します。もし str がヌルではなく、str->tie() から始まる連結されたストリームオブジェクトの連鎖をたどることで tie() に到達できる場合、未定義の動作となります。

目次

[編集] パラメータ

str - 連結ストリームとして設定する出力ストリーム

[編集] 戻り値

連結ストリーム、または連結ストリームがなかった場合はヌルポインタ。

[編集] 例外

実装定義の例外をスローする場合があります。

[編集] 注記

デフォルトでは、標準ストリーム std::coutstd::cin および std::cerr と連結されています。同様に、そのワイド文字版である std::wcoutstd::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 2つのストリームが互いに連結される可能性[1]
(直接的または別の仲介ストリームオブジェクトを介して)
この場合、動作は未定義である
  1. std::basic_ostream::flush()UnformattedOutputFunction であるため、呼び出される際にセントリーオブジェクトを作成します。ストリームオブジェクトに対して flush() が呼び出されると、セントリーオブジェクトの コンストラクタ がその連結されたストリームに対して flush() を呼び出し、その flush() は別のセントリーオブジェクトを構築し、そのコンストラクタはさらにそのストリームの連結されたストリームに対して flush() を呼び出し、といった具合に処理が続きます。したがって、ストリーム ab が(直接的または間接的に)互いに連結されている場合、a.flush() を呼び出すと、最終的に b.flush() が呼び出され、さらに a.flush() が呼び出され、無限ループが発生します。
English 日本語 中文(简体) 中文(繁體)