C++: назначить cin переменной ifstream?
Вы знаете общую идиому 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() );
2 ответа
Решение
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
не предназначен для удаления.
- Сохраните начальный поток буфера cin в переменную
- Измените поток буфера cin на файл из файла.
- Делай то, что тебе нужно
- И не забудьте восстановить cin streambuf перед закрытием вашего файла - RAII может помочь.