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

Trying to switch between std::cout and std::ifstream

本文关键字:std 之间 ifstream cout      更新时间:2023-10-16

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

void read1()
{
  int a, b;
  while (std::cin >> a >> b) {
    // do something
  }
}

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

对于大循环,很难维护这两个函数,因为循环部分是公共的,唯一的区别是输入源。

如何集成这两个功能?

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

void read(std::istream& input)
{
  while (input >> a >> b) { .... }
}

然后切换到主叫侧。

if (something)
{
  read(std::cin);
} else
{
  isfream input(....);
  read(input);
}

std::ifstream和std::cin都是输入流,您可以用istream作为参数来调用函数