• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    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

    参照