C++ 如何在C++;?

C++ 如何在C++;?,c++,redirect,assert,stderr,ofstream,C++,Redirect,Assert,Stderr,Ofstream,当参数为false时,是否可以将断言输出重定向到文件?我知道它的默认行为是向stderr写入消息,但以下操作并没有像我预期的那样工作: #include <iostream> #include <assert> #include <fstream> using namespace std; //--------------------------------------------------------------------------- int main

当参数为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;
}
//---------------------------------------------------------------------------
并在stdout中产生以下结果:

B
Assertion failed: 1 == 2, file C:\xxx\Unit1.cpp, line 14
Abnormal program termination
我本来以为stdout中打印的最后两行是test.txt文件。 我也试着用,而不是

cerr.rdbuf(ofs.rdbuf());
以下是:

freopen("test.txt", "a", stderr);
但效果并不好


我还看到一些帖子(如)建议dup2重定向流,如unistd.h中定义的stderr。但是我在Windows上使用C++Builder,它似乎不可用。

您可以在程序开始时将所有输出重定向到stderr,或将任何其他标准文件句柄重定向到文件

   freopen( "error.log","w",stderr);
请在此处阅读:

@编辑:如果输出转到标准输出,则需要执行以下操作:

   freopen( "error.log","w",stdout );
如果要追加而不是覆盖error.log:

   freopen( "error.log","aw",stdout );

你在哪个站台?适用于我。输出中的C:\表示Windows;-)Johannes猜对了:Windows上的Windows
\u dup()
\u dup2()
在包含
和调用
\u dup2(ofs,2)
后可用,我得到编译错误:““E2268调用未定义的函数”\u dub2”。它不是只对VisualStudio编译器可用吗?我正在使用Borland的C++Builder 6编译器bcc32。这不起作用。我已经测试过了,它一直在stdout中编写断言消息。此外,文件的内容被覆盖,这是不可取的。此外,我发现“assert”的实现将其输出发送到stdout,这令人费解。哇!它真的做到了吗?甚至使用
freopen(“test.txt”,“aw”,stdout),它一直在stdout中打印assert消息,而不是在文件中。当我说程序已将某些内容打印到stdout时,我的意思是当程序从cmd.exe执行时,可以在windows提示中看到该消息。它可能会转到stderr。您的断言是在进入main之前发生的吗?如果是这样的话,您将不得不像在构造函数中一样对正在断言的静态类执行freopen。
   freopen( "error.log","aw",stdout );