3

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

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

prog [input-file]

如果指定了输入文件,则应从该文件中读取,否则应从 cin 中读取。

据我所知,它们都实现了istream. 您将如何设置它以便我可以执行类似的操作in >> var,其中.inistream

4

4 回答 4

7

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

void do_input(std::istream& the_istream)
{
    int my_awesome_variable;
    the_istream >> my_awesome_variable;
}

使用示例:

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

    // reading from a file:
    std::ifstream fs("test.txt");
    do_input(fs);
}
于 2010-09-24T23:44:02.323 回答
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
}

您可以将其中的一些工作转移到一个辅助类中,以便更清楚地了解正在发生的事情(请注意,在无法打开文件的情况下,这具有稍微不同的行为):

#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));
}
于 2010-09-24T23:55:17.383 回答
1

我的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;


}
于 2010-09-25T00:18:21.417 回答
-1
istream& input = cin;

或者

inputFileStream ifstream(fileName);
istream& input = inputFileStream;

但是我认为这不是一个很好的方法,因为 cin 没有close()而 ifstream 有。

于 2010-09-24T23:52:50.143 回答