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

时间:2013-05-23 00:39:01

标签: 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.

9 个答案:

答案 0 :(得分:86)

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

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

这是Visual Studio的严重限制,甚至可能无法满足C ++标准。我觉得很伤心地看到disinformative“答案”在这里试图隐藏自己宝贵的Visual Studio的这一缺陷。

答案 1 :(得分:25)

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

AllocConsole();
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);  

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

答案 2 :(得分:9)

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

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

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

答案 3 :(得分:8)

解决方案:此答案解决了该问题,并允许您将控制台输出重定向到Visual Studio输出窗口。 首先,我们需要一个覆盖默认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;

然后,在某个地方你想&#34;激活&#34;写入VS输出窗口:

std::cout.rdbuf(&g_DebugStreamFor_cout); // Redirect std::cout to OutputDebugString!

答案 4 :(得分:3)

不要使用cout,而是创建一个日志文件并将任何内容写入其中。

编辑: 使用这个简单的代码写入日志文件。

ofstream log;
log.open ("log.txt");
log << "Writing this to a file.\n";
log.close();

答案 5 :(得分:2)

我想给我2美分。

鉴于可能是关于符合C ++标准的VS问题,或者我们可以使用OutputDebugStringA,如果你不能修改你的代码库,你可能会想到简单地将std :: cout重定向到某个东西的想法否则,就像文件一样。

因此,如果不更改代码库,您可以执行以下建议:How to redirect cin and cout to files?

冷凝的:

  • 添加包含#include <fstream>
  • 在您应用的开头,在某些初始化中,在登录之前您可以使用:
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!
  • 你的app / logging结尾处:
  

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

希望这可能对某人有所帮助,感谢Nawaz在另一个主题中提供答案。

答案 6 :(得分:2)

只需在代码末尾使用std :: cin.get(),例如:

std::cout << "print this" << std::endl;
std::cin.get();

这会强制程序保持打开状态并等待用户输入。

无论如何都适合我。归功于TheChernoProject:https://www.youtube.com/channel/UCQ-W1KE9EYfdxhL6S4twUNw

答案 7 :(得分:0)

您可以使用.Net函数,例如System :: Diagnostics :: Debug :: WriteLine(“ your message”)。您甚至可以添加条件以仅在调试模式下而不在发行模式下打印。例如:

#ifdef DEBUG   
   System::Diagnostics::Debug::WriteLine("your message");
#endif   

答案 8 :(得分:-1)

是的,确实很烦人。

这是我的操作方式:

#define DBOUT( s )            \
{                             \
std::wostringstream os_;    \
   os_ << s;                   \
   OutputDebugStringW( os_.str().c_str() );  \
}
// example :    DBOUT("some text " << some_variable << "   some more text" << some_other_varaible << "\n");