C ++: atribua a CIN a uma variável ifstream?
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() );
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.