Pergunta

Eu preciso escrever um programa que leia a partir ifstream ou cin, dependendo de parâmetros passados ??para o programa em tempo de execução.

Eu estava pensando em fazer o seguinte:

 istream in;

 if(argv[1] == "cin")
 {
      in = cin;
 }
 else
 {
      ifStream inFile;
      inFile.open(argv[1].c_str());
      in = inFile;
 }

No entanto, istream em protegido, e eu não posso declarar istream no. Existe uma maneira de declarar tal genéricos no stream?

Foi útil?

Solução

Tente com uma istream* vez. Note, no entanto, que você tem que mudar seu código ligeiramente. Usando ponteiros você tem que preservar a área de memória do objeto que você está apontando. Em outras palavras, a variável "infile" não pode ser declarado lá, como ele não vai existir fora da outra pessoa. O código poderia ser, então:

 istream* in;
 ifStream inFile;

 if(!strcmp(argv[1],"cin"))
 {
      in = &cin;
 }
 else
 {
      inFile.open(argv[1]);
      in = &inFile;
 }
 // use *in

(Note-se também as modificações na manipulação de strings. Eu modifiquei-los como um exemplo.)

Outras dicas

Um projeto alternativo é escrever seu código usando cin, e depois usar redirecionamento de entrada ao executar o programa se você quiser aceitar a entrada de um arquivo. Isso não responder à sua pergunta exata, mas é um design mais simples para o caso de você apresentado.

Por exemplo, em vez de

program.exe cin

você apenas executar

program.exe

e em vez de

program.exe myfile.txt

Você iria correr

program.exe < myfile.txt

Isso funciona em * nix e Windows.

Você também pode fazer isso sem os ponteiros:

ifStream inFile;
istream in( argv[1] == "cin" ? cin : inFile.open(argv[1]));
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top