我正在使用 microsoft Visual Studio 来做 C++。 我在 IDE 的输出控制台中没有看到 std::err 和 std::out 。 有没有办法重定向它们?
您确实可以重定向 std::out 和 std::err。只需在解决方案资源管理器中右键单击您的项目并选择
Properties
。然后选择 Configuration Properties -> Debugging
并将适当的参数放入 Command Arguments
字段中。例如,要将 std::err 重定向到文件,我会输入 2> ErrorLog.txt
。
当 Visual Studio 运行程序时,您输入的内容
Command Arguments
只是作为命令行参数附加,就像您手动将它们输入到控制台一样。因此,上面的示例只是告诉 VisualStudio 使用命令 <programName>.exe 2> ErrorLog.txt
而不是仅仅 <programName>.exe
来运行您的程序。
您可以做的是将 cout 重定向到您选择的 ostringstream。为此,请从 streambuf 派生一个新类,该类会将流发送到 OutputDebugString(我们将此类称为 OutputDebugStream)并创建该类的实例 myStream。现在打电话:
cout.rdbuf(&myStream)
我用 cout 作为例子。同样的技术可以与cerr一起使用,只需调用
cerr.rdbuf(&myStream).
如果您不使用 cout,Stdout 会有点困难。您可以在运行时使用 freopen()
重定向
stdout,但它必须重定向到文件。要使其重定向到调试屏幕有点困难。一种方法是使用
fmemopen()
(如果可用)(它不是标准的)并编写 streambuf 将此数据输出到调试屏幕。或者,您可以重定向到文件并写入流以作为输入打开并重定向到调试流。还需要一点工作,但我认为这是可能的。
我使用以下宏输出到 Visual Studio 控制台
#ifdef _MSC_VER
#include <Windows.h>
#include <iostream>
#include <sstream>
#include <opencv/cxcore.h>
#define DBOUT( s ) \
{ \
std::wostringstream os_; \
os_ << s; \
OutputDebugStringW( os_.str().c_str() ); \
}
#else
#define DBOUT( s ) \
{ \
std::cout << s; \
}
#endif
现在我是否只能让它在 cuda 内核中工作?!