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() );
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.
- Save the initial streambuf of cin into a variable
- Change the streambuf of cin to the one from the file.
- Do what you need to do
- And don't forget to restore cin streambuf before closing your file -- RAII may help.
来源:https://stackoverflow.com/questions/2159452/c-assign-cin-to-an-ifstream-variable