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é.