【问题标题】:How can I see cout output in a non-console application?如何在非控制台应用程序中查看 cout 输出?
【发布时间】:2013-05-23 00:39:00
【问题描述】:

输出到调试窗口似乎相当乏味。如果我正在编写非控制台信息,我在哪里可以找到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.

【问题讨论】:

  • Perhals 使用日志框架,例如 NLog,它允许您将日志输出定向到任何/所有文件、控制台、查看器应用程序、电子邮件等?
  • 我正要这么说,但作为替代建议,Poco 有一个,我相信 Boost 也有。我无法从被认为是最好的个人经验中发言。
  • 你真正的问题是什么?您是否想在非控制台应用程序中查看cout 的输出?还是如您的评论中所指出的,您想查看b 的值?
  • @BenjaminLindley 当然是我想看看 cout 的输出。我想查看cout 输出的b 的值。

标签: c++ visual-studio


【解决方案1】:

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

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

这是 Visual Studio 的一个严重限制,甚至可能无法满足 C++ 标准。我很难过在这里看到虚假的“答案”试图隐藏他们宝贵的 Visual Studio 的这个缺陷。

【讨论】:

  • 虽然这仍然是一个有效的观点,但对于那些对方便的解决方法感兴趣的人:看看下面的 Trevor Hickeys 回答。
  • 请看我的回答。我已经做到了。实际上在调试输出窗口中。没有单独的控制台窗口。
【解决方案2】:

对于 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

【讨论】:

  • 但这会打开一个额外的窗口。我希望输出位于 Visual Studio 的“调试输出”窗格中。
【解决方案3】:

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

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

过多的输出语句会导致程序严重变慢。然而,捕捉调试器有问题的东西是一种很好的技术,例如在使用基指针时实际的子成员。

【讨论】:

  • 唯一的一点是 OutputDebugStringA 是一个 WINAPI。如果您正在创建 Windows 控制台应用程序,这很好,但如果您想要没有 Windows 的纯 C++(是的,即使使用 Visual Studio 2017!),您不能使用这个。
【解决方案4】:

解决方案:此答案解决了问题,并允许您将控制台输出重定向到 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;

然后,您想在某个地方“激活”写入 VS 输出窗口:

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

【讨论】:

    【解决方案5】:

    我想给我的 2 美分。

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

    因此,您可以在不更改代码库的情况下执行此处建议的操作:How to redirect cin and cout to files?

    精简:

    • 添加包含#include &lt;fstream&gt;
    • 在您的应用开始时,在某些初始化中,在记录之前,您可以使用:
    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】:

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

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

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

    【讨论】:

    • "如果我正在编写非控制台信息,我在哪里可以找到 cout 输出?"这没有回答问题。
    • @LuchianGrigore: “我想检查一下 b 是否为零。” -- 它解决了这个问题。
    • @BenjaminLindley 如果我在没有评论的情况下写了完全相同的问题,它会作为重复的内容被关闭,我的问题也不会得到回答。
    • @LuchianGrigore:嗯,这个问题显然需要一些工作。 OP的目标不明确,所以我要求澄清。但就目前而言,这个答案确实解决了 OP 面临的明显问题。而且我不会是那些亲密的选民之一。
    • @CDT 是的,它应该在运行时工作。唯一的问题是变量从log 变为myfile 在示例中途 - 它应该是一致的。
    【解决方案7】:

    您可以使用 System::Diagnostics::Debug::WriteLine("your message") 等 .Net 函数。您甚至可以添加一个仅在调试模式而不是在发布模式下打印的条件。例如:

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

    【讨论】:

      【解决方案8】:

      是的,确实很烦人。

      我是这样做的:

      #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");
      

      【讨论】:

      • 解释代码比只粘贴代码sn-p更有益。如果您可以通过评论或写一点来解释您的代码,那就太好了。
      猜你喜欢
      • 2019-09-10
      • 1970-01-01
      • 2020-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-28
      • 1970-01-01
      相关资源
      最近更新 更多