在調用第三方庫之前,您可以將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>
和''。
上述類將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");
希望這有助於。
來源
2015-08-08 11:53:10
yzt