如何在C ++ / Windows中输出到控制台

时间:2009-02-25 20:43:52

标签: c++ windows console sdl iostream

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

14 个答案:

答案 0 :(得分:16)

既然你提到了stdout.txt我就谷歌了解它究竟会创建一个stdout.txt;通常情况下,即使使用Windows应用程序,控制台输出也会转到分配的控制台,如果没有分配,则无处可去。

因此,假设您使用SDL(这是唯一提出stdout.txt的内容),您应该遵循建议here。 freopen stdout和带有“CON”的stderr,或者那里的其他链接器/编译变通办法。

如果链接再次被破坏,这正是从libSDL引用的内容:

  

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

     

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

     

“如果您定义”NO_STDIO_REDIRECT“并重新编译SDL,我认为它将解决问题。” > > (答案由Bill Kendrick提供)

答案 1 :(得分:13)

您可以使用 Adding Console I/O to a Win32 GUI App 中描述的过程将控制台添加到Windows非控制台应用程序。

该主题有a whole thread on gamedev.net

答案 2 :(得分:7)

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

OutputDebugStringW(L"My output string.");

答案 3 :(得分:5)

如果您有非控制台Windows应用程序,则可以使用 AllocConsole 功能创建控制台。一旦创建,您可以使用普通的std :: cout方法写入它。

答案 4 :(得分:4)

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

其次,

std::cout << "Hello World" << std::endl;

应该适用于任何C ++控制台应用程序。

答案 5 :(得分:4)

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

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

此外,您应该将WinMain更改为此签名:

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

答案 6 :(得分:4)

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

答案 7 :(得分:3)

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

这是一个代码示例:

#include <iostream>

using namespace std;

int main (int) {
    cout << "This will print to the console!" << endl;
}

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

我希望我没弄错!

答案 8 :(得分:3)

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

  • 如果您使用subsystem:console,那么您将获得写入终端的所有stdout。麻烦的是,如果你从开始菜单/桌面启动应用程序,你(默认情况下)会出现一个控制台出现以及应用程序窗口(看起来很丑陋)。
  • 如果使用子系统:windows,即使从DOS窗口Cygwin窗口,http://dslweb.nwnexus.com/~ast/dload/guicon.htm或其他终端运行应用程序,也不会获得stdout / stderr。

如果您希望输出到终端的中间路径IF应用程序是在终端中启动的,那么请按照Luke在其解决方案中提供的链接({{3}})

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

答案 9 :(得分:2)

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

答案 10 :(得分:1)

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

答案 11 :(得分:0)

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

答案 12 :(得分:0)

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

答案 13 :(得分:0)

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();