C ++: assigner cin à une variable ifstream?

Vous connaissez l’idiome stdio commun que stdin est spécifié par un nom de fichier de “-“, par exemple

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

Quelle est la meilleure façon de faire cela avec une instance ifstream ? J’ai reçu un peu de code ifstream un ifstream dans le cadre d’une classe et j’aimerais append du code pour faire l’équivalent, quelque chose comme:

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

cin n’est pas un ifstream , mais si vous pouvez utiliser istream place, vous êtes istream à gagner. Sinon, si vous êtes prêt à être non-portable, ouvrez simplement /dev/stdin ou /dev/fd/0 ou autre chose. 🙂


Si vous voulez être portable et que votre programme utilise istream , voici une façon de le faire:

 struct noop { void operator()(...) const {} }; // ... shared_ptr input; if (filename == "-") input.reset(&cin, noop()); else input.reset(new ifstream(filename.c_str())); 

Le noop consiste à spécifier un suppresseur qui ne fait rien dans le cas cin , car, bien, cin n’est pas destiné à être supprimé.

  • Enregistrer le streambuf initial de cin dans une variable
  • Changez le streambuf de cin en celui du fichier .
  • Fais ce que tu dois faire
  • Et n’oubliez pas de restaurer cin streambuf avant de fermer votre fichier – RAII peut vous aider.