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?

È stato utile?

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]));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top