2010-11-02 10 views
7

¿Cómo se puede lanzar un ifstream en un istream? Me imagino que si ifstream es hijo de istream debería poder hacerlo, pero he tenido problemas con esa tarea.Convierte ifstream en istream

std::istream & inputStr = std::cin; 
    std::ostream & outputStr = std::cout; 
    if(argc == 3){ 
    std::fstream inputFile; 
    inputFile.open(argv[1], std::fstream::in); 
    if(!inputFile){ 
     std::cerr << "Error opening input file"; 
     exit(1); 
    } 
    inputStr = inputFile; 
..... 
} 
+0

http://coding.derkeiler.com/Archive/C_CPP/comp.lang.cpp/2004-09/0856.html – DumbCoder

+0

De hecho se puede asignar directamente, pero si usted está teniendo problemas, debería publicar su código para que sepamos qué está mal. – casablanca

+0

No deberías necesitarlo. Puede usar la secuencia de archivos en cualquier lugar donde se necesite una secuencia istream y el compilador realizará un autocolado para usted. –

Respuesta

1

Probar:

std::ifstream* myStream; 
std::istream* myOtherStream = static_cast<std::istream*>(myStream); 
myOtherStream = myStream; // implicit cast since types are related. 

Lo mismo funciona si tiene una referencia (&) para el tipo de flujo también. static_cast es preferible en este caso ya que la conversión se realiza en tiempo de compilación, lo que permite al compilador informar de un error si la conversión no es posible (es decir, istream no era un tipo base de ifstream).

Además, y probablemente ya lo sepa, puede pasar un puntero/referencia a ifstream a cualquier función que acepte un puntero/referencia a istream. Por ejemplo, la siguiente es permitido por el lenguaje:

void processStream(const std::istream& stream); 

std::ifstream* myStream; 
processStream(*myStream); 
+0

Creo que el 'static_cast' en su primer bloque de código no ocurre en el lugar, por lo que debe asignarse a un puntero' std :: istream': 'std :: istream * myStream2 = static_cast (myStream); '. –

+1

¿Por qué o por qué o por qué debería pasar un puntero cuando lo haría una referencia? –

+0

@Martin: solo estaba mostrando la flexibilidad del idioma. Como no estaba claro desde la pregunta del OP exactamente qué problema está experimentando. –

0
std::istream *istreamObj = dynamic_cast<std::istream *>(&ifStreamObj) 
+0

Olvidó un asterisco en su lanzamiento dinámico. Creo que quisiste decir 'std :: istream * istreamObj = dynamic_cast (& ifStreamObj)' –

+1

No solo no verificaste que el código fuera correcto. No hay una necesidad real para el elenco. Sácalo y todavía compila bien. Cuando el compilador funciona para usted, no hay necesidad de hacerlo usted mismo. –

+0

Mis más sinceras disculpas. Mis muñecas han sido cortadas, por lo que ningún mortal puede volver a ver mis errores. Relájate un poco, ¿eh? Agregar un '*' ... – Neil

20

Sin elenco es necesario.

#include <fstream> 
int main() 
{ 
    using namespace std; 
    ifstream f; 
    istream& s = f; 
} 
+2

Me ayudaría en mi humilde opinión mencionar que esto funciona debido al polimorfismo, es decir, el hecho de que ifstream es una subclase de istream. (¡Por favor, corríjame si estoy equivocado!) –

+2

@ Lee-Man: el OP ya mencionó eso (terminología modulo), entonces no lo hice. Aclamaciones, –