Вопрос

Вы знаете общую идиому 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 может помочь.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top