Visual Studio - 如何在非控制台应用程序中查看cout输出?

CDT*_*CDT 26 c++ visual-studio

输出到调试窗口似乎相当繁琐.cout如果我正在编写非控制台信息,我在哪里可以找到输出?

喜欢:

double i = a / b;
cout << b << endl;//I want to check out whether b is zero. It seems the output cannot be found anywhere.
Run Code Online (Sandbox Code Playgroud)

小智 89

问题很清楚.如何使用std :: cout在Visual Studio中调试非控制台应用程序.

答案很清楚:你做不到.也就是说,Visual Studio不支持std :: cout作为非控制台应用程序的调试工具.

这是Visual Studio的严重限制,甚至可能无法满足C++标准.我发现在这里试图隐藏其宝贵的Visual Studio的缺陷时,会感到非常难过.

  • 虽然这仍然是一个有效的观点,但对于那些对方便的解决方法感兴趣的人来说:看看下面 Trevor Hickeys 的回答。 (2认同)

Tre*_*key 30

对于Windows解决方案,您可以分配控制台,并将cout/cin绑定到它.例如:

AllocConsole();
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);  
Run Code Online (Sandbox Code Playgroud)

文档:https:
//msdn.microsoft.com/en-us/library/windows/desktop/ms681944%28v=vs.85%29.aspx


Tho*_*ews 10

要将字符串输出到调试控制台,请使用OutputDebugStringA.请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/aa363362%28v=vs.85%29.aspx

要将变量值输出到调试控制台,请使用std::ostringstream,将字符串发送到OutputDebugStringA.

过多的输出语句将导致程序严重减速.但是,它是一种很好的技术来捕获调试器有问题的东西,比如在使用基本指针时实际的子成员.


Luc*_*oom 10

SOLUTION:此答案解决了该问题,并允许您将控制台输出重定向到Visual Studio Output窗口.首先,我们需要一个覆盖默认cout字符串流的类:

class dbg_stream_for_cout
    : public std::stringbuf
{
public:
    ~dbg_stream_for_cout() { sync(); }
    int sync()
    {
        ::OutputDebugStringA(str().c_str());
        str(std::string()); // Clear the string buffer
        return 0;
    }
};
dbg_stream_for_cout g_DebugStreamFor_cout;
Run Code Online (Sandbox Code Playgroud)

然后,在某处您要"激活"写入VS输出窗口:

std::cout.rdbuf(&g_DebugStreamFor_cout); // Redirect std::cout to OutputDebugString!
Run Code Online (Sandbox Code Playgroud)


Ste*_*ora 5

我想给我的 2 美分。

鉴于这可能是关于符合 C++ 标准的 VS 问题,或者我们可以使用OutputDebugStringA,如果您无法修改您的代码库,您可能会喜欢简单地将 std::cout 重定向到其他内容(例如文件)的想法。

因此,在不更改代码库的情况下,您可以执行以下建议的操作:如何将 cin 和 cout 重定向到文件?

浓缩:

  • 添加包含 #include <fstream>
  • 在您的应用程序开始时,在某些 init 中,在登录之前,您可以使用:
std::ofstream out("out.txt");
std::streambuf *coutbuf = std::cout.rdbuf(); //save old buf
std::cout.rdbuf(out.rdbuf()); //redirect std::cout to out.txt!
Run Code Online (Sandbox Code Playgroud)
  • 在您的应用程序/日志记录结束时:

std::cout.rdbuf(coutbuf); //再次重置为标准输出

希望这可以帮助某人,感谢 Nawaz 在另一个线程中提供了答案。