C Interface commune pour « cin » et « Fichier »
Question
Y at-il une interface commune pour l'entrée cin et le fichier?
Je veux faire un programme qui a un paramètre optionnel
prog [input-file]
Si un fichier d'entrée est spécifié, il faut lire à partir du fichier, et sinon, il faut lire cin.
D'après ce que je peux dire, ils ont tous deux mettre en œuvre istream
. Comment voulez-vous mettre en place pour que je puisse faire quelque chose comme in >> var
, où in
est un istream
.
La solution
#include <iostream>
#include <fstream>
int main(int argc, char **argv)
{
std::ifstream f;
if (argc >= 2) {
f.open(argv[1]);
}
std::istream &in = (argc >= 2) ? f : std::cin;
// use in here
}
Vous pourriez transférer une partie de ce travail dans une classe d'aide pour le rendre plus clair ce qui se passe (notez que cela a un comportement légèrement différent dans le cas où le fichier ne peut pas être ouvert):
#include <iostream>
#include <fstream>
class ifstream_or_cin_t {
std::ifstream f;
public:
ifstream_or_cin_t(const char *filename)
{
if (filename) {
f.open(filename);
}
}
operator std::istream &() { return f.is_open() ? f : std::cin; }
};
static void do_input(std::istream &in)
{
// use in...
}
int main(int argc, char **argv)
{
do_input(
ifstream_or_cin_t((argc >= 2) ? argv[1] : NULL));
}
Autres conseils
Vous pouvez écrire une fonction qui prend une référence à un std::istream
:
void do_input(std::istream& the_istream)
{
int my_awesome_variable;
the_istream >> my_awesome_variable;
}
Exemple d'utilisation:
int main()
{
// reading from stdin:
do_input(std::cin);
// reading from a file:
std::ifstream fs("test.txt");
do_input(fs);
}
vaut mon 2P:
#include <iostream>
#include <fstream>
#include <string>
extern char const* findFlag(int,char*[],char const*);
int main(int argc,char* argv[])
{
std::string isFile = findFlag(argc,argv,"-f");
std::ifstream file;
if (isFile != "")
{ file.open(isFile.c_str());
}
std::istream& data = isFile != "" ? file : std::cin;
}
istream& input = cin;
ou
inputFileStream ifstream(fileName);
istream& input = inputFileStream;
Cependant, je pense que ce n'est pas une très bonne méthode car cin ne dispose pas d'un close()
alors ifstream fait.