C++: assign cin to an ifstream variable?

c++, ifstream, iostream

Solution

`cin` is not an `ifstream`, but if you can use `istream` instead, then you're in to win. Otherwise, if you're prepared to be non-portable, just open `/dev/stdin` or `/dev/fd/0` or whatever. :-)

If you do want to be portable, and can make your program use `istream`, here's one way to do it:

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

// ...

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

The `noop` is to specify a deleter that does nothing in the `cin` case, because, well, `cin` is not meant to be deleted.

Problem

You know the common stdio idiom that `stdin` is specified by a filename of "-", e.g. ``` if ((strcmp(fname, "-")) fp = fopen(fname); else fp = stdin; ``` What's the best way to do this with an `ifstream` instance? I've received a bit of code that has an `ifstream` as part of a class and I'd like to add code to do the equivalent, something like: ``` if ( filename == "-") logstream = cin; // **how do I do this*?* else logstream.open( filename.c_str() ); ```

Original source