名前空間
変種
操作

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

From cppreference.com
< cpp‎ | io‎ | basic ios
 
 
 
 
basic_ios& copyfmt( const basic_ios& other );

もし other*this と同じオブジェクトを参照している場合、効果はありません。それ以外の場合、ストリーム other の状態を *this にコピーします。これは以下の順序で行われます。

1) register_callback() によって登録されたすべてのコールバックを、パラメータとして erase_event を渡して呼び出します。
2) other からのすべてのメンバオブジェクトを *this にコピーしますが、rdstate()、例外マスク、および rdbuf() は除きます。特に、ロケール、フォーマットフラグ、配列 std::ios_base::iword および std::ios_base::pword の内容(ただし、`iword` および `pword` ポインタ自体は除く)のコピー、コールバック、および tied ストリームを作成します。
3) register_callback() によって登録されたすべてのコールバックを、パラメータとして copyfmt_event を渡して呼び出します。
4) 例外マスクを other から *this に、exceptions(other.exceptions()) を呼び出すかのようにコピーします。

目次

[編集] パラメータ

その他 - ソースとして使用する別のストリーム

[編集] 戻り値

*this

[編集] 注意

コールバックの2回目の通過は、std::ios_base::pword のポインタに含まれるユーザー定義オブジェクトをディープコピーするために使用される場合があります。

copyfmt() は、ストリームの状態を保存および復元するために使用できます。Boost は、同じ目的のための、よりきめ細かな I/O 状態セーバーライブラリを提供しています。

[編集]

std::ofstream オブジェクト "out" を、フォーマット、tie() による std::cin へのバインドなど、すべてにおいて std::cout とまったく同じように動作させます。

#include <bitset>
#include <climits>
#include <fstream>
#include <iostream>
 
int main()
{
    std::ofstream out;
 
    out.copyfmt(std::cout); // copy everything except rdstate and rdbuf
    out.clear(std::cout.rdstate()); // copy rdstate
    out.basic_ios<char>::rdbuf(std::cout.rdbuf()); // share the buffer
 
    out << "Hello, world\n";
 
    auto bin = [](std::ios_base::fmtflags f)
    {
        return std::bitset<sizeof(std::ios_base::fmtflags) * CHAR_BIT>
            { static_cast<unsigned long long>(f) };
    };
    std::ofstream out2;
    std::cout << "1) out2.flags(): " << bin(out2.flags()) << '\n';
    std::cout << "2) cout.flags(): " << bin(std::cout.flags()) << '\n';
    std::cout.setf(std::ios::hex | std::ios::fixed | std::ios::boolalpha);
    std::cout << "3) cout.flags(): " << bin(std::cout.flags()) << '\n';
    out2.copyfmt(std::cout); // copy everything except rdstate and rdbuf
    std::cout << "4) out2.flags(): " << bin(out2.flags()) << '\n';
}

実行結果の例

Hello, world
1) out2.flags(): 00000000000000000001000000000010
2) cout.flags(): 00000000000000000001000000000010
3) cout.flags(): 00000000000000000001000000001111
4) out2.flags(): 00000000000000000001000000001111

[編集] 欠陥レポート

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 256 C++98 ステップ 3 は、登録されたコールバックを
イベントタイプ copy_event で呼び出しましたが、これは定義されていません。
に修正されました
copyfmt_event
LWG 292 C++98 もし other*this と同じオブジェクトを参照している場合、メンバオブジェクト
はコピーされ、登録されたコールバックは呼び出されました。
何もしない
この場合に
English 日本語 中文(简体) 中文(繁體)