在 Linux 上使用 C++ 中的 iostream 时,它会在终端中显示程序输出,但在 Windows 中,它只是将输出保存到 stdout.txt 文件中。在 Windows 中,如何使输出显示在控制台中?
13 回答
既然你提到了stdout.txt,我用谷歌搜索看看究竟是什么会创建一个stdout.txt;通常,即使使用 Windows 应用程序,控制台输出也会发送到分配的控制台,如果没有分配控制台,则不会发送到任何地方。
因此,假设您使用的是 SDL(这是唯一出现 stdout.txt 的内容),您应该遵循此处的建议。使用“CON”打开标准输出和标准错误,或者在那里执行其他链接器/编译解决方法。
如果链接再次断开,这正是从 libSDL 中引用的内容:
如何避免创建 stdout.txt 和 stderr.txt?
“我相信在 SDL 附带的 Visual C++ 项目中,有一个 SDL_nostdio 目标 > 你可以构建它做你想要的(TM)。”
“如果你定义“NO_STDIO_REDIRECT”并重新编译SDL,我认为它会解决问题。” > > (答案由比尔·肯德里克提供)
对于 Visual Studio 中的调试,您可以打印到调试控制台:
OutputDebugStringW(L"My output string.");
如果您使用的是 Visual Studio,则需要修改项目属性: 配置属性->链接器->系统->子系统。
这应该设置为:控制台 (/SUBSYSTEM:CONSOLE)
此外,您应该将 WinMain 更改为此签名:
int main(int argc, char **argv)
{
//...
return 0;
}
如果您有一个非控制台的 Windows 应用程序,您可以使用AllocConsole函数创建一个控制台。创建后,您可以使用普通的 std::cout 方法对其进行写入。
如果您使用的是 Visual Studio,它应该可以正常工作!
这是一个代码示例:
#include <iostream>
using namespace std;
int main (int) {
cout << "This will print to the console!" << endl;
}
确保在创建新项目时选择了 Win32 控制台应用程序。您仍然可以使用控制台开关 (>>) 将项目的输出重定向到文件。这实际上会将控制台管道从标准输出重定向到您的文件。(例如,myprog.exe >> myfile.txt
)。
我希望我没有记错!
AllocConsole Windows API 函数将为您的应用程序创建一个控制台窗口。
是否使用子系统:控制台或子系统:窗口取决于您是否要启动应用程序:
- 如果您使用子系统:控制台,那么您会将所有标准输出写入终端。问题在于,如果您从开始菜单/桌面启动应用程序,您(默认情况下)会出现一个控制台以及应用程序窗口(可能看起来很丑)。
- 如果您使用subsystem:windows,即使您从DOS窗口、Cygwin或其他终端运行应用程序,您也不会获得stdout/stderr。
如果您想要中间方式,即如果应用程序在终端中启动,则输出到终端,然后按照 Luke 在他的解决方案中提供的链接(http://dslweb.nwnexus.com/~ast/dload/guicon。 .htm )
作为参考,我遇到了这个问题,我想根据命令行开关在正常 Windows 模式或批处理模式(即作为脚本的一部分)下运行该应用程序。控制台和 Windows 应用程序之间的整个区别对于 Unix 人来说有点奇怪!
首先,您使用的是什么编译器或开发环境?如果是 Visual Studio,则需要制作控制台应用程序项目以获取控制台输出。
第二,
std::cout << "Hello World" << std::endl;
应该在任何 C++ 控制台应用程序中工作。
您的应用程序必须编译为 Windows 控制台应用程序。
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();
我假设您使用的是某个版本的 Visual Studio?在 Windows 中,std::cout << "something";
如果您的程序在项目设置中设置为控制台程序,则应将内容写入控制台窗口。
如果使用MinGW,请添加一个选项,-Wl,subsystem,console
或者-mconsole
.
您不一定需要对代码进行任何更改(也不需要更改SUBSYSTEM
类型)。如果您愿意,您也可以简单地将stdout和 stderr 传送到控制台应用程序(Windows 版本cat
运行良好)。