20

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

4

13 回答 13

17

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

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

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

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

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

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

于 2009-02-25T21:08:12.900 回答
10

对于 Visual Studio 中的调试,您可以打印到调试控制台:

OutputDebugStringW(L"My output string.");
于 2013-06-21T01:10:19.353 回答
6

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

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

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

int main(int argc, char **argv)
{
    //...
    return 0;
}
于 2009-02-25T20:52:31.720 回答
6

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

于 2009-02-25T20:56:23.613 回答
4

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

这是一个代码示例:

#include <iostream>

using namespace std;

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

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

我希望我没有记错!

于 2009-02-25T20:54:54.883 回答
4

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

于 2009-02-25T21:00:28.533 回答
4

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

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

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

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

于 2009-11-11T21:06:00.740 回答
3

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

第二,

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

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

于 2009-02-25T20:47:44.790 回答
2

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

于 2009-02-25T20:47:16.523 回答
2

有一个很好的解决方案

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();
于 2018-04-29T14:20:24.980 回答
1

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

于 2009-02-25T20:47:33.183 回答
1

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

于 2012-06-17T08:24:09.517 回答
0

您不一定需要对代码进行任何更改(也不需要更改SUBSYSTEM类型)。如果您愿意,您也可以简单地将stdout和 stderr 传送到控制台应用程序(Windows 版本cat运行良好)。

于 2013-08-05T18:49:10.040 回答