Подтвердить что ты не робот

С++: назначить 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() );
4b9b3361

Ответ 1

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

Ответ 2

  • Сохранить исходный streambuf of cin в переменной
  • Измените streambuf cin на один из файла.
  • Сделайте то, что вам нужно сделать
  • И не забудьте восстановить cin streambuf перед закрытием файла - может помочь RAII.