C ++: assegnare CIN a una variabile ifstream?
Domanda
Conosci il comune idioma stdio che stdin
è specificato da un nome file di "-", ad esempio
if ((strcmp(fname, "-"))
fp = fopen(fname);
else
fp = stdin;
Qual è il modo migliore per farlo con un ifstream
esempio? Ho ricevuto un po 'di codice che ha un ifstream
Come parte di una classe e vorrei aggiungere codice per fare l'equivalente, qualcosa di simile:
if ( filename == "-")
logstream = cin; // **how do I do this*?*
else
logstream.open( filename.c_str() );
Soluzione
cin
non è un ifstream
, ma se puoi usare istream
Invece, allora sei dentro per vincere. Altrimenti, se sei pronto per essere non portabile, solo aperto /dev/stdin
o /dev/fd/0
o altro. :-)
Se tu fare vuoi essere portatile e può utilizzare il tuo programma istream
, ecco un modo per farlo:
struct noop {
void operator()(...) const {}
};
// ...
shared_ptr<istream> input;
if (filename == "-")
input.reset(&cin, noop());
else
input.reset(new ifstream(filename.c_str()));
Il noop
è specificare un deleter che non fa nulla in cin
caso, perché, beh, cin
non è pensato per essere eliminato.
Altri suggerimenti
- Salva la iniziale StreamBuf di CIN in una variabile
- Cambiare il StreamBuf di CIN al uno dal file.
- Fai quello che devi fare
- E non dimenticare di ripristinare CIN StreamBuf prima di chiudere il file: RAII può aiutarti.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow