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 倒是很方便重定向。