Вы знаете общую stdio идиому это stdin
определяется именем файла "-", например.
if ((strcmp(fname, "-"))
fp = fopen(fname);
else
fp = stdin;
Что лучший способ состоит в том, чтобы сделать это с ifstream
экземпляр? Я получил немного кода, который имеет ifstream
как часть класса и я хотел бы добавить код, чтобы сделать эквивалент, что-то как:
if ( filename == "-")
logstream = cin; // **how do I do this*?*
else
logstream.open( filename.c_str() );
cin
не является ifstream
, но если вы можете использовать istream
вместо него, то вы в выигрыше. В противном случае, если вы готовы быть неподвижным, просто откройте /dev/stdin
или /dev/fd/0
или что-то в этом роде. :-)
Если вы делаете хотите быть переносимым, и можете заставить вашу программу использовать istream
, вот один способ сделать это:
struct noop {
void operator()(...) const {}
};
// ...
shared_ptr<istream> input;
if (filename == "-")
input.reset(&cin, noop());
else
input.reset(new ifstream(filename.c_str()));
Ноуп noop
- это указать удалитель, который ничего не делает в случае cin
, потому что, ну, cin
не предназначен для удаления.