试图在std :: cout和std :: ifstream之间切换

mah*_*ood 2 c++ cin ifstream

我想从任何一个std::cinstd::ifstream从命令行确定的输入读取.该命令看起来像./run 1./run 2.现在,我必须根据读取模式编写两个几乎相似的函数.

void read1()
{
  int a, b;
  while (std::cin >> a >> b) {
    // do something
  }
}
Run Code Online (Sandbox Code Playgroud)

要么

void read2()
{
  int a, b;
  std::ifstream fin("file.txt");
  while (fin >> a >> b) {
    // do something
  }
}
Run Code Online (Sandbox Code Playgroud)

对于大循环,很难保持这两个函数,因为循环部分是常见的,唯一的区别是输入源.

如何整合这两个功能?

jua*_*nza 8

std::cin并且std::ifstream都是std::istreams,因此您可以通过使用对引用进行操作的函数来解决此问题std::istream.这将适用于std::cin,std::ifstream实例和任何其他std::istreams:

void read(std::istream& input)
{
  while (input >> a >> b) { .... }
}
Run Code Online (Sandbox Code Playgroud)

然后打开来电方.

if (something)
{
  read(std::cin);
} else
{
  isfream input(....);
  read(input);
}
Run Code Online (Sandbox Code Playgroud)