dichiarando istream generica in C ++
Domanda
Ho bisogno di scrivere un programma che legge sia da ifstream o cin, a seconda dei parametri passati al programma in fase di esecuzione.
Stavo pensando di fare il seguente:
istream in;
if(argv[1] == "cin")
{
in = cin;
}
else
{
ifStream inFile;
inFile.open(argv[1].c_str());
in = inFile;
}
Tuttavia, IStream in protetto, e non può dichiarare istream in. C'è un modo per dichiarare una generica nel flusso?
Soluzione
Prova con un istream*
invece. Si noti, tuttavia, che è necessario modificare leggermente il codice. Utilizzando i puntatori si deve preservare la zona di memoria dell'oggetto che si sta puntando. In altre parole, la variabile "infile" non può essere dichiarato lì, in quanto non esisterà fuori dal resto. Il codice potrebbe essere, allora:
istream* in;
ifStream inFile;
if(!strcmp(argv[1],"cin"))
{
in = &cin;
}
else
{
inFile.open(argv[1]);
in = &inFile;
}
// use *in
(nota anche modifiche nella manipolazione stringa. Li modificato come esempio.)
Altri suggerimenti
Un progetto alternativo è quello di scrivere il codice utilizzando cin
, e quindi utilizzare quando si esegue il programma se si desidera accettare input da un file. Questo non risponde alla tua domanda esatta, ma si tratta di un design più semplice per il caso hai presentato.
Per esempio, invece di
program.exe cin
si sarebbe solo eseguire
program.exe
invece di
program.exe myfile.txt
si eseguire
program.exe < myfile.txt
Questo funziona su * nix e Windows.
È anche possibile fare questo senza i puntatori:
ifStream inFile;
istream in( argv[1] == "cin" ? cin : inFile.open(argv[1]));