C ++: ¿Asignar CIN a una variable ifstream?
Pregunta
Conoces el idioma común de stdio que stdin
se especifica por un nombre de archivo de "-", por ejemplo
if ((strcmp(fname, "-"))
fp = fopen(fname);
else
fp = stdin;
¿Cuál es la mejor manera de hacer esto con un ifstream
¿instancia? He recibido un poco de código que tiene un ifstream
Como parte de una clase y me gustaría agregar código para hacer el equivalente, algo como:
if ( filename == "-")
logstream = cin; // **how do I do this*?*
else
logstream.open( filename.c_str() );
Solución
cin
no es un ifstream
, pero si puedes usar istream
En cambio, entonces estás en ganar. De lo contrario, si está preparado para no ser portátil, simplemente abra /dev/stdin
o /dev/fd/0
o lo que sea. :-)
Si usted hacer Quiere ser portátil y puede hacer que su programa use istream
, aquí hay una forma de hacerlo:
struct noop {
void operator()(...) const {}
};
// ...
shared_ptr<istream> input;
if (filename == "-")
input.reset(&cin, noop());
else
input.reset(new ifstream(filename.c_str()));
los noop
es especificar un perjudicial que no haga nada en el cin
caso, porque, bueno, cin
no está destinado a ser eliminado.
Otros consejos
- Guardar la inicial StreamBuf de Cin en una variable
- Cambiar el StreamBuf de Cin hacia uno del archivo.
- Haz lo que necesitas hacer
- Y no olvide restaurar CIN StreamBuf antes de cerrar su archivo: RAII puede ayudar.