Question

Je dois écrire un programme qui lit soit de ifstream ou cin, en fonction des paramètres transmis dans le programme en cours d'exécution.

Je comptais faire ce qui suit:

 istream in;

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

Cependant, istream à protéger, et je ne peux pas déclarer istream. Est-il possible de déclarer un tel générique dans le flux?

Était-ce utile?

La solution

Essayez avec un istream* à la place. Notez, cependant, que vous devez changer votre code légèrement. En utilisant des pointeurs vous devez préserver la zone de mémoire de l'objet que vous pointez. En d'autres termes, la variable « inFile » ne peut pas y être déclarée, car il ne sera pas exister hors de l'autre. Le code pourrait être, alors:

 istream* in;
 ifStream inFile;

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

(Notez également les modifications dans la gestion de chaîne. Je les modifia comme exemple.)

Autres conseils

Une conception alternative est d'écrire votre code à l'aide cin, puis utilisez lors de l'exécution du programme si vous voulez accepter l'entrée d'un fichier. Cela ne répond pas à votre question exacte, mais il est une conception plus simple pour le cas que vous avez présenté.

Par exemple, au lieu de

program.exe cin

vous suffit d'exécuter

program.exe

et au lieu de

program.exe myfile.txt

vous courriez

program.exe < myfile.txt

Cela fonctionne sur * nix et Windows.

Vous pouvez aussi le faire sans les pointeurs:

ifStream inFile;
istream in( argv[1] == "cin" ? cin : inFile.open(argv[1]));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top