declarar genérico istream en c++
Pregunta
Necesito escribir un programa que lee en cualquiera de ifstream o cin, dependiendo de los parámetros que se pasan en el programa en tiempo de ejecución.
Yo estaba pensando en hacer lo siguiente:
istream in;
if(argv[1] == "cin")
{
in = cin;
}
else
{
ifStream inFile;
inFile.open(argv[1].c_str());
in = inFile;
}
Sin embargo, istream protegidas, y yo no puedo declarar istream en.Es allí una manera de declarar un genérico en el stream?
Solución
Pruebe con un istream*
en su lugar.Nota, sin embargo, que usted tiene que cambiar su código ligeramente.El uso de punteros que tiene que preservar el área de memoria del objeto que usted está apuntando.En otras palabras, la "inFile" variables pueden ser declaradas de allí, ya que no existen fuera de la persona.El código podría ser, entonces:
istream* in;
ifStream inFile;
if(!strcmp(argv[1],"cin"))
{
in = &cin;
}
else
{
inFile.open(argv[1]);
in = &inFile;
}
// use *in
(Tenga en cuenta también las modificaciones en el manejo de cadenas de caracteres.He modificado como un ejemplo.)
Otros consejos
Una alternativa de diseño es escribir el código con cin
, y , a continuación, utilizar redirección de entrada cuando se ejecuta el programa si desea aceptar la entrada de un archivo.Esto no contesta a su pregunta exacta, pero es un diseño más simple para el caso de que usted presentó.
Por ejemplo, en lugar de
program.exe cin
usted acaba de ejecutar
program.exe
y en lugar de
program.exe myfile.txt
tendría que ejecutar
program.exe < myfile.txt
Esto funciona en *nix y Windows.
También se puede hacer esto sin los punteros:
ifStream inFile;
istream in( argv[1] == "cin" ? cin : inFile.open(argv[1]));