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?

¿Fue útil?

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]));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top