17

stdin「-」のファイル名で指定される一般的なstdioイディオムを知っています。

if ((strcmp(fname, "-"))
    fp = fopen(fname);
else
    fp = stdin;

ifstreamインスタンスでこれを行う最良の方法は何ですか? クラスの一部として asを持つコードを少し受け取りました。ifstream次のようなコードを追加して、同等のことを行いたいと思います。

if ( filename == "-")
    logstream = cin;  // **how do I do this*?*
else
    logstream.open( filename.c_str() );
4

2 に答える 2

24

cinではありませんがifstream、代わりに使用できる場合istreamは、勝つことができます。それ以外の場合は、移植不可にする準備ができている場合は、単に開く/dev/stdinか、/dev/fd/0または何でもします。:-)


移植可能にしたい場合、およびプログラムで を使用できる場合istreamは、次の 1 つの方法を使用できます。

struct noop {
    void operator()(...) const {}
};

// ...

shared_ptr<istream> input;
if (filename == "-")
    input.reset(&cin, noop());
else
    input.reset(new ifstream(filename.c_str()));

は、削除することを意図していないため、ケースでnoop何もしないdeleterを指定することです。cincin

于 2010-01-29T02:16:11.503 に答える
0
  • cinの初期streambuf を変数に保存する
  • cin の streambuf をfileのものに変更します。
  • やるべきことをやる
  • また、ファイルを閉じる前に cin streambuf を復元することを忘れないでください。RAII が役立つ場合があります。
于 2010-01-29T15:52:18.097 に答える