输出到调试窗口似乎相当繁琐。如果我正在编写非控制台信息,我在哪里可以找到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.
答案 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!
的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");