Pergunta

Você conhece o idioma comum do stdio que stdin é especificado por um nome de arquivo de "-", por exemplo

if ((strcmp(fname, "-"))
    fp = fopen(fname);
else
    fp = stdin;

Qual é a melhor maneira de fazer isso com um ifstream instância? Eu recebi um pouco de código que tem um ifstream Como parte de uma aula e eu gostaria de adicionar código para fazer o equivalente, algo como:

if ( filename == "-")
    logstream = cin;  // **how do I do this*?*
else
    logstream.open( filename.c_str() );
Foi útil?

Solução

cin não é um ifstream, mas se você pode usar istream Em vez disso, então você vai ganhar. Caso contrário, se você estiver preparado para não ser portável, apenas aberto /dev/stdin ou /dev/fd/0 como queiras. :-)


Se você Faz quero ser portátil e pode fazer o seu programa usar istream, aqui está uma maneira de fazer isso:

struct noop {
    void operator()(...) const {}
};

// ...

shared_ptr<istream> input;
if (filename == "-")
    input.reset(&cin, noop());
else
    input.reset(new ifstream(filename.c_str()));

o noop é especificar um deleter que não faça nada no cin caso, porque, bem, cin não é para ser excluído.

Outras dicas

  • Salve a inicial Streambuf of CIN em uma variável
  • Mudar o Streambuf of CIN para o um do arquivo.
  • Faça o que você precisa fazer
  • E não se esqueça de restaurar o CIN Streambuf antes de fechar seu arquivo - Raii pode ajudar.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top