C++ で cin や cout のストリーム元・先を入れ換える2021年08月10日 12時46分48秒

C++ で cin や cout を一時的に切替えたい時がある。そのような時は、streambuf を用いて、iostream の先を入れ換える。

例などを調べると、istream や ostream を受け取るように書かれていることが多いが、どちらも std::ios クラスから継承されている。汎用的なクラスを書く場合は ios で処理を書いた方が便利。

#include <ios>
#include <iostream>
#include <ssstream>

class redirect_stream
{
public:
    redirect_stream( std::streambuf* newbuf, std::ios& os )
        : os_( os )
        , oldbuf_( os.rdbuf( newbuf ) )
    {}

    ~redirect_stream()
    {
        os_.rdbuf( oldbuf_ );
    }

private:
    std::ios& os_;
    std::streambuf *oldbuf_;
};

int main()
{
    std::stringstream in, out;
    redirect_stream rin( in.rdbuf(), std::cin );
    redirect_stream rout( out.rdbuf(), std::cout );

    ...
}
std::streambuf* ではなく、ios を受け取って、streambuf を内部的に取得した方が良いかも知れない。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2021/08/10/9407765/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。