déclarant istream générique c ++
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?
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]));