declarando istream genéricos no c ++
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?
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]));