【问题标题】:How to output to the console in C++/Windows如何在 C++/Windows 中输出到控制台
【发布时间】:2010-10-09 22:07:00
【问题描述】:

在 Linux 上的 C++ 中使用 iostream 时,它会在终端中显示程序输出,但在 Windows 中,它只是将输出保存到 stdout.txt 文件中。在 Windows 中,如何使输出显示在控制台中?

【问题讨论】:

  • stdout.txt 在哪里?在您的输出文件夹中?

标签: c++ windows console sdl iostream


【解决方案1】:

既然你提到了stdout.txt,我用谷歌搜索看看究竟是什么会创建一个stdout.txt;通常,即使使用 Windows 应用程序,控制台输出也会发送到分配的控制台,如果没有分配,则不会发送到任何地方。

因此,假设您使用的是 SDL(这是唯一会显示 stdout.txt 的内容),您应该遵循建议 here。使用“CON”打开标准输出和标准错误,或者在那里执行其他链接器/编译解决方法。

如果链接再次断开,这正是从 libSDL 中引用的内容:

如何避免创建 stdout.txt 和 stderr.txt?

“我相信在 SDL 附带的 Visual C++ 项目中有一个 SDL_nostdio 目标 > 你可以构建它做你想做的事(TM)。”

“如果您定义“NO_STDIO_REDIRECT”并重新编译 SDL,我认为它会解决问题。” > >(由比尔·肯德里克提供答案)

【讨论】:

  • 非常感谢!这让我烦恼了很长一段时间
【解决方案2】:

要在 Visual Studio 中进行调试,您可以打印到调试控制台:

OutputDebugStringW(L"My output string.");

【讨论】:

    【解决方案3】:

    如果您有一个非控制台的 Windows 应用程序,您可以使用 AllocConsole 函数创建一个控制台。创建后,您可以使用普通的 std::cout 方法对其进行写入。

    【讨论】:

    • 我认为您仍然必须重定向 io 描述符才能使其工作(就像 guicon 示例一样)。或者只使用 OutputDebugString 代替。
    【解决方案4】:

    如果您使用的是 Visual Studio,则需要修改 项目属性配置属性 -> 链接器 -> 系统 -> 子系统.

    这应该设置为:控制台 (/SUBSYSTEM:CONSOLE)

    你还应该把你的 WinMain 改成这个签名:

    int main(int argc, char **argv)
    {
        //...
        return 0;
    }
    

    【讨论】:

      【解决方案5】:

      AllocConsole Windows API 函数将为您的应用程序创建一个控制台窗口。

      【讨论】:

        【解决方案6】:

        如果您使用的是 Visual Studio,它应该可以正常工作!

        这是一个代码示例:

        #include <iostream>
        
        using namespace std;
        
        int main (int) {
            cout << "This will print to the console!" << endl;
        }
        

        确保在创建新项目时选择了 Win32 控制台应用程序。您仍然可以使用控制台开关 (>>) 将项目的输出重定向到文件。这实际上会将控制台管道从标准输出重定向到您的文件。 (例如,myprog.exe &gt;&gt; myfile.txt)。

        希望我没有记错!

        【讨论】:

          【解决方案7】:

          是否使用子系统:控制台或子系统:窗口取决于您是否要启动应用程序:

          • 如果您使用subsystem:console,那么您会将所有标准输出写入终端。问题在于,如果您从“开始”菜单/桌面启动应用程序,您(默认情况下)会看到一个控制台以及应用程序窗口(可能看起来很丑)。
          • 如果您使用subsystem:windows,即使您从DOS 窗口、Cygwin 或其他终端运行应用程序,也不会获得stdout/stderr。

          如果您想要在终端中启动应用程序时输出到终端的中间方式,请点击 Luke 在他的解决方案中提供的链接 (http://dslweb.nwnexus.com/~ast/dload/guicon.htm)

          作为参考,我遇到了这个问题,我想根据命令行开关在正常 Windows 模式或批处理模式(即作为脚本的一部分)下运行的应用程序。控制台和 Windows 应用程序之间的整个区别对于 Unix 人来说有点奇怪!

          【讨论】:

          • 您需要稍微更改链接中的示例:如果应用程序是在控制台上启动的,则将 AllocConsole() 替换为 AttachConsole(ATTACH_PARENT_PROCESS) 以输出到启动应用程序的同一控制台。如果不是,此函数将返回 0。
          • 你能不能把我带到定义“如果你使用子系统:windows,你不会得到 stdout/stderr”的 MSDN 文档中
          【解决方案8】:

          首先,您使用的是什么编译器或开发环境?如果是 Visual Studio,则需要制作一个控制台应用程序项目来获取控制台输出。

          第二,

          std::cout &lt;&lt; "Hello World" &lt;&lt; std::endl;

          应该在任何 C++ 控制台应用程序中工作。

          【讨论】:

          • 不,它发送到标准输出 - 并且并不总是写入控制台(取决于它的分配方式)。因此,OP 的问题,以及我在将近两年后阅读此线程的原因! :-)
          【解决方案9】:

          您的应用程序必须编译为 Windows 控制台应用程序。

          【讨论】:

            【解决方案10】:

            There is a good solution

            if (AllocConsole() == 0)
            {
                // Handle error here. Use ::GetLastError() to get the error.
            }
            
            // Redirect CRT standard input, output and error handles to the console window.
            FILE * pNewStdout = nullptr;
            FILE * pNewStderr = nullptr;
            FILE * pNewStdin = nullptr;
            
            ::freopen_s(&pNewStdout, "CONOUT$", "w", stdout);
            ::freopen_s(&pNewStderr, "CONOUT$", "w", stderr);
            ::freopen_s(&pNewStdin, "CONIN$", "r", stdin);
            
            // Clear the error state for all of the C++ standard streams. Attempting to accessing the streams before they refer
            // to a valid target causes the stream to enter an error state. Clearing the error state will fix this problem,
            // which seems to occur in newer version of Visual Studio even when the console has not been read from or written
            // to yet.
            std::cout.clear();
            std::cerr.clear();
            std::cin.clear();
            
            std::wcout.clear();
            std::wcerr.clear();
            std::wcin.clear();
            

            【讨论】:

            • 感谢您的评论。我的新版本 VS 默默地忽略了标准输出
            【解决方案11】:

            我假设您使用的是 Visual Studio 的某个版本?在 Windows 中,如果您的程序在项目设置中设置为控制台程序,std::cout &lt;&lt; "something"; 应该向控制台窗口写入内容。

            【讨论】:

              【解决方案12】:

              如果使用MinGW,请添加一个选项-Wl,subsystem,console-mconsole

              【讨论】:

                【解决方案13】:

                您不一定需要对代码进行任何更改(也不必更改 SUBSYSTEM 类型)。如果您愿意,您也可以简单地使用pipe stdout and stderr to a console applicationcat 的 Windows 版本运行良好)。

                【讨论】:

                  猜你喜欢
                  • 2011-02-20
                  • 1970-01-01
                  • 2015-12-31
                  • 2010-09-16
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多