C++: назначить cin переменной ifstream?

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

Решение

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

Другие вопросы по тегам