当参数为false时,是否可以将断言输出重定向到文件?我知道它的默认行为是向 stderr 写入消息,但以下内容没有像我预期的那样工作:
#include <iostream>
#include <assert>
#include <fstream>
using namespace std;
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
ofstream ofs;
ofs.open("test.txt", ios_base::out);
ofs << "A";
cerr << "B";
cerr.rdbuf(ofs.rdbuf());
cerr << "C";
assert(1 == 2);
return 0;
}
//---------------------------------------------------------------------------
测试结果.txt:
AC
并导致标准输出:
B
Assertion failed: 1 == 2, file C:xxxUnit1.cpp, line 14
Abnormal program termination
我期待在 stdout 中打印的这 2 行在测试.txt文件中。我也尝试过使用,而不是...
cerr.rdbuf(ofs.rdbuf());
以下内容:
freopen("test.txt", "a", stderr);
但它并没有奏效。
我还看到一些帖子(如C:如何将stderr从System-command重定向到stdout或file?)建议dup2重定向流,例如在unistd.h中定义的stderr。但是我在Windows上使用C++Builder,它似乎不可用。
您可以在程序开始时将所有输出重定向到 stderr,或任何其他标准文件句柄重定向到文件。
freopen( "error.log","w",stderr);
在这里阅读有关此内容的信息:
http://support.microsoft.com/kb/58667
@edit:如果输出转到标准输出,那么您需要执行以下操作:
freopen( "error.log","w",stdout );
如果要追加而不覆盖错误.log:
freopen( "error.log","aw",stdout );