C ++: назначить cin переменной ifstream? - PullRequest
16 голосов
/ 29 января 2010

Вы знаете общую идиому 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() );

Ответы [ 2 ]

23 голосов
/ 29 января 2010

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 не предназначено для удаления.

0 голосов
/ 29 января 2010
  • Сохранить начальный streambuf cin в переменную
  • Измените streambuf cin на из файла .
  • Делай то, что тебе нужно
  • И не забудьте восстановить cin streambuf перед закрытием файла - RAII может помочь.
...