C++ 重定向输出的几种方案:iostream rdbuf、stdio freopen、unix fd

在看 Modern CMake for C++ 的时候看到了这段代码:

void RunOutputsCorrectEquations() {
  string expected {"2 + 2 = 4\n3 * 3 = 9\n"};
  stringstream buffer;
  // redirect cout
  auto prevcoutbuf = cout.rdbuf(buffer.rdbuf());
  run();
  auto output = buffer.str();
  // restore original buffer
  cout.rdbuf(prevcoutbuf);
  if (expected != output)
    exit(1);
}

看起来 stdio 的 FILE 也能重定向(但是不能保存之前的关联,因而恢复到 stdout 不能跨平台):

https://stackoverflow.com/a/29154180/

// 重定向
freopen("output.txt", "a+", stdout);

// 恢复到终端输出
freopen("/dev/tty", "w", stdout); /*for gcc, ubuntu*/
// or
freopen("CON", "w", stdout); /*Mingw C++; Windows*/

没办法保存之前的输出!

不能直接给 stdout 赋值,因为 stdout 不保证是可写的变量。

*nix 的 fd 倒是很方便重定向。