2010-01-29 22 views
16

Usted conoce la terminología stdio común que stdin está especificada por un nombre de archivo de "-", p. Ej.C++: asignar cin a una variable ifstream?

if ((strcmp(fname, "-")) 
    fp = fopen(fname); 
else 
    fp = stdin; 

Cuál es la mejor manera de hacer esto con una instancia ifstream? He recibido un poco de código que tiene un ifstream como parte de una clase y me gustaría añadir código para hacer el equivalente, algo así como:

if (filename == "-") 
    logstream = cin; // **how do I do this*?* 
else 
    logstream.open(filename.c_str()); 

Respuesta

22

cin no es una ifstream, pero si puede usar istream en su lugar, entonces está listo para ganar. De lo contrario, si está preparado para ser no portátil, solo abra /dev/stdin o /dev/fd/0 o lo que sea. :-)


Si haces quieren ser portátil y se puede garantizar que utiliza el programa de istream, aquí hay una manera 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())); 

El noop es especificar un Deleter que no hace nada en el caso cin, porque, bueno, cin no está destinado a borrarse.

+0

gracias ... esto solo tiene que ser portátil para Linux y osx, entonces/dev/stdin lo es! (suspiro) –

+1

esto ilustra cómo nadie se sentó y creó un conjunto medio aceptable de librerías de C++. (Diría boost si no tuviera tantos problemas de versiones) –

+1

FWIW, con C++ 11 en lugar de pasar 'noop()' a 'reset' (y definir la estructura), un aspecto simple (y divertido) '[] (...) {}' lo hace. – akim

0
+0

Escribí una respuesta muy similar hace una hora, pero luego la borré después de volver a leer esta parte de la pregunta: "He recibido un poco de código que tiene un ifstream como parte de una clase". El título de la pregunta es engañoso, ya que se puede leer como "cómo redirijo cin para leer desde un archivo", pero es, IIUC, al revés: OP ya tiene un ifstream y desea redirigirlo a cin. –

+0

De hecho. No podemos cambiar el streambuf de un ifstream como ese. Al igual que en la solución de Chris Jester-Young, se debe cambiar el tipo exacto de flujo utilizado. –

Cuestiones relacionadas