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() );
16
задан Mark Harrison 29 January 2010 в 02:11
поделиться

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

23
ответ дан 30 November 2019 в 21:53
поделиться
  • Сохранить начальную Streambuf of Cin в переменной
  • Измените Streambuf of Cin к , один из файла .
  • Делайте то, что вам нужно сделать
  • и не забудьте восстановить streambuf cin, прежде чем закрывать файл - Raii может помочь.
0
ответ дан 30 November 2019 в 21:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: