"cin"和"File"的C++通用接口

Ver*_*gen 3 c++ io cin istream

cin和文件输入是否有通用接口?

我想制作一个具有可选参数的程序

prog [input-file]
Run Code Online (Sandbox Code Playgroud)

如果指定了输入文件,那么它应该从文件中读取,如果没有,则应该从cin读取.

据我所知,他们都实施了istream.你将如何设置它,这样我可以做这样的事情in >> var,在这里in是一个istream.

Jam*_*lis 7

您可以编写一个引用以下内容的函数std::istream:

void do_input(std::istream& the_istream)
{
    int my_awesome_variable;
    the_istream >> my_awesome_variable;
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

int main()
{
    // reading from stdin:
    do_input(std::cin);

    // reading from a file:
    std::ifstream fs("test.txt");
    do_input(fs);
}
Run Code Online (Sandbox Code Playgroud)


dav*_*ave 7

#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
}
Run Code Online (Sandbox Code Playgroud)

您可以将这项工作中的一部分转移到辅助类中,以使其更清晰(请注意,在无法打开文件的情况下,这种行为略有不同):

#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));
}
Run Code Online (Sandbox Code Playgroud)