C ++: Attribuez CIN à une variable IFStream?
Question
Vous connaissez l'idiome stdio commun qui 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 un ifstream
exemple? J'ai reçu un peu de code qui a un ifstream
Dans le cadre d'une classe et j'aimerais ajouter du code pour faire l'équivalent, quelque chose comme:
if ( filename == "-")
logstream = cin; // **how do I do this*?*
else
logstream.open( filename.c_str() );
La solution
cin
n'est pas un ifstream
, mais si vous pouvez utiliser istream
Au lieu de cela, alors vous êtes pour gagner. Sinon, si vous êtes prêt à être non portable, il suffit d'ouvrir /dev/stdin
ou /dev/fd/0
ou peu importe. :-)
Si vous fais Vous voulez être portable et peut faire en sorte que votre programme utilise istream
, voici une façon de le faire:
struct noop {
void operator()(...) const {}
};
// ...
shared_ptr<istream> input;
if (filename == "-")
input.reset(&cin, noop());
else
input.reset(new ifstream(filename.c_str()));
La noop
est de spécifier un déleter qui ne fait rien dans le cin
Cas, parce que bien, cin
n'est pas censé être supprimé.
Autres conseils
- Enregistrer l'initiale Streambuf de CIN dans une variable
- Changer la Streambuf de CIN au un du fichier.
- Faire ce que vous devez faire
- Et n'oubliez pas de restaurer CIN StreamBuf avant de fermer votre dossier - RAII peut vous aider.