您可以在调用第 3 方库之前将 stdout 和 stderr 重定向到一个文件,然后再将它们重定向回来。
你可以这样写一个类:(这是针对 Windows 和 Visual C++ 的。其他更类似于 POSIX 的环境需要稍微不同的代码。)
class RedirectStandardOutputs {
private:
int m_old_stdout, m_old_stderr;
public:
RedirectStandardOutputs (char const * stdout_name, char const * stderr_name)
: m_old_stdout (-1), m_old_stderr (-1)
{
fflush (stdout);
fflush (stderr);
m_old_stdout = _dup(_fileno(stdout));
m_old_stderr = _dup(_fileno(stderr));
freopen (stdout_name, "wb", stdout);
freopen (stderr_name, "wb", stderr);
}
~RedirectStandardOutputs ()
{
fflush (stdout);
fflush (stderr);
_dup2 (m_old_stdout, _fileno(stdout));
_dup2 (m_old_stderr, _fileno(stderr));
}
};
还请记住,您需要同时包含 <stdio.h> 和 <io.h>。
上述类在其构造函数中将stdout 和stderr 重定向到普通文件,并在其析构函数中恢复它们。你可以这样使用它:
// This function writes stuff to the console:
void Foo (int i)
{
printf ("(%d) Hello, world!\n", i);
fprintf (stderr, "(%d) Hello, again.\n", i);
}
// ...
// Later, you call the Foo() function three times, but only the
// second one is redirected:
Foo (0);
{
RedirectStandardOutputs rso ("x.txt", "y.txt");
Foo (1);
}
Foo (2);
请注意,这可能不是很快(特别是在 Windows 上),因此请将其置于对性能敏感的区域之外。
如果你想禁用写入控制台而不是仅仅将它们重定向到文本文件,你仍然可以使用这种方法,但你必须传入字符串 "NUL" 作为文件名,即:
RedirectStandardOutputs rso ("NUL", "NUL");
希望这会有所帮助。