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() );
Était-ce utile?

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.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top