最終更新日時:
が更新

履歴 編集

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

参照