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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top