2010-02-07 7 views
3

Je dois écrire un programme qui lit soit ifstream soit cin, en fonction des paramètres passés dans le programme lors de l'exécution.déclaration d'istream générique en C++

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 en est-il un moyen de déclarer un tel générique dans le flux.?

Répondre

3

Essayez plutôt avec un istream*. Notez, cependant, que vous devez modifier légèrement votre code. 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 être déclarée ici, car elle n'existera pas ailleurs. 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 chaîne je les modifiée comme un exemple.)

+0

Ok, j'ai essayé, mais le code suivant produit l'erreur suivante: CODE: while (* in.Good()) { chaîne de caractères; getline (* dans, ligne); cout << ligne; } ERREUR: demande de membre 'bon' dans 'in', qui est de type non-class 'std :: istream *' – finiteloop

+1

Utilisez '(* in) .good' ou' in-> good'. Installez-vous simplement et familiarisez-vous avec la syntaxe C++. Vous économiserez beaucoup d'heures :) –

+0

oh, d'accord. Merci pour l'aide. Je ne pensais juste pas bien. – finiteloop

1

Une conception alternative est d'écrire votre code à l'aide cin, puis utilisez input redirection lors de l'exécution du programme si vous souhaitez accepter l'entrée d'un fichier. Cela ne répond pas à votre question exacte, mais c'est un design 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.

0

Vous pouvez également faire sans les pointeurs:

ifStream inFile; 
istream in(argv[1] == "cin" ? cin : inFile.open(argv[1]));