C ++: назначить CIN переменной IFSTREAM?
Вопрос
Вы знаете общую идиому 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
не предназначен для удаления.
Другие советы
- Сохраните начальный Streambuf of Cin в переменную
- Изменить Streambuf of Cin в один из файла.
- Делай то, что тебе нужно сделать
- И не забудьте восстановить Cin Streambuf, прежде чем закрыть файл - Raii может помочь.