最終更新日時(UTC): 2026年04月25日 00時09分04秒
rotarymars が更新

履歴 編集

function
<ios>

# std::basic_ios::tie

    basic_ostream<CharT, Traits>* tie() const;                                  // (1)

    basic_ostream<CharT, Traits>* tie(basic_ostream<CharT, Traits>* tiestr);    // (2)

## 概要

同期する出力ストリームオブジェクトを取得・設定する。

## 要件

- 引数 `tiestr` がヌルポインタでは無い場合、`tiestr` から `tie()` をたどって再び `tiestr` に到達できないこと。（C++11 から）

## 効果

- (1) -
- (2) `*this` に紐づくストリーム（`basic_ostream`）オブジェクトを引数 `tiestr` に設定する（`tie() == tiestr` となる）。

## 戻り値

- (1) `*this` に紐づいている出力ストリーム（`basic_ostream`）オブジェクトへのポインタ
- (2) 引数 `tiestr` が設定される前の `tie()`

## 備考

- 入力ストリーム（`basic_istream`）、および、出力ストリーム（`basic_ostream`）の `tie()` に出力ストリームを設定すると、書式化・非書式化入出力を実行するたびに `tie()->flush()` が実行される。
  これにより、`*this` で書式化・非書式化入出力を実行する際には必ず `tie()` で指定された出力ストリームがフラッシュされることが保証される。
  なお、この動作は、`basic_istream::sentry::sentry`、および、`basic_ostream::sentry::sentry` によって引き起こされる。
- 上記の要件欄の記載は C++11 で追加されたが、これは、`basic_ostream::flush()` が非書式化出力であることによる。
  （`basic_ostream::flush()` が `tie()` で指定された出力ストリームのフラッシュを引き起こし、それが次のフラッシュを引き起こし…となり、無限ループを引き起こしてしまうため）
  したがって、明記はされていないものの C++03 まででも必要な要件であるものと思われる。（C++03 では、`basic_ostream::flush()` が非書式化出力ではない旨の記載が追加されたが、これは誤りということで C++11 で修正された）
  なお、この要件は「`tie` に設定した後でこのようになってはいけない」という意味であるものと思われる。（さもないと、設定したことによって無限ループが生じることを防げない）
- 標準入出力ストリームは、以下のような設定が行われている。
  - `cin.tie() == &cout`
  - `wcin.tie() == &wcout`
  - `cerr.tie() == &cout`（C++11 から）
  - `wcerr.tie() == &wcout`（C++11 から）

## 例

    #include <iostream>
    #include <fstream>
    #include <string>

    void input(std::istream& ifs)
    {
      std::string s;
      if (ifs >> s) {
          std::cout << s << '\n';
      } else {
        std::cout << (ifs.rdstate() & std::ios_base::badbit ? "bad" : "not bad") << ", ";
        std::cout << (ifs.rdstate() & std::ios_base::eofbit ? "eof" : "not eof") << ", ";
        std::cout << (ifs.rdstate() & std::ios_base::failbit ? "fail" : "not fail") << '\n';
        ifs.clear();
      }
    }

    int main()
    {
      static const char filename[] = "test.txt";
      std::ofstream ofs(filename);
      std::ifstream ifs(filename);

      ofs << "new content\n";
      input(ifs);               // 出力してもフラッシュされていなければ入力できない

      ifs.tie(&ofs);
      input(ifs);               // tie していれば入力時に自動的にフラッシュされる
    }

### 出力

    not bad, eof, fail
    new

## バージョン

### 言語

- C++98

## 関連項目

- `cin`
- `cout`
- `cerr`
- `wcin`
- `wcout`
- `wcerr`
- `basic_istream::sentry::sentry`
- `basic_ostream::sentry::sentry`

## 参照

- 60. What is a formatted input function?
  C++03 で `basic_ostream::flush()` が非書式化出力ではないと明記された Defect Report
- 581. flush() not unformatted function
  上記の Defect Report で非書式化出力ではなくなってしまった `basic_ostream::flush()` を非書式化出力に変更する Defect Report
- 835. Tying two streams together (correction to DR 581)
  `tiestr` に関する要件を追加する Defect Report