【发布时间】:2010-10-09 22:07:00
【问题描述】:
在 Linux 上的 C++ 中使用 iostream 时,它会在终端中显示程序输出,但在 Windows 中,它只是将输出保存到 stdout.txt 文件中。在 Windows 中,如何使输出显示在控制台中?
【问题讨论】:
-
stdout.txt 在哪里?在您的输出文件夹中?
标签: c++ windows console sdl iostream
在 Linux 上的 C++ 中使用 iostream 时,它会在终端中显示程序输出,但在 Windows 中,它只是将输出保存到 stdout.txt 文件中。在 Windows 中,如何使输出显示在控制台中?
【问题讨论】:
标签: c++ windows console sdl iostream
既然你提到了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,我认为它会解决问题。” > >(由比尔·肯德里克提供答案)
【讨论】:
要在 Visual Studio 中进行调试,您可以打印到调试控制台:
OutputDebugStringW(L"My output string.");
【讨论】:
如果您有一个非控制台的 Windows 应用程序,您可以使用 AllocConsole 函数创建一个控制台。创建后,您可以使用普通的 std::cout 方法对其进行写入。
【讨论】:
如果您使用的是 Visual Studio,则需要修改 项目属性: 配置属性 -> 链接器 -> 系统 -> 子系统.
这应该设置为:控制台 (/SUBSYSTEM:CONSOLE)
你还应该把你的 WinMain 改成这个签名:
int main(int argc, char **argv)
{
//...
return 0;
}
【讨论】:
AllocConsole Windows API 函数将为您的应用程序创建一个控制台窗口。
【讨论】:
如果您使用的是 Visual Studio,它应该可以正常工作!
这是一个代码示例:
#include <iostream>
using namespace std;
int main (int) {
cout << "This will print to the console!" << endl;
}
确保在创建新项目时选择了 Win32 控制台应用程序。您仍然可以使用控制台开关 (>>) 将项目的输出重定向到文件。这实际上会将控制台管道从标准输出重定向到您的文件。 (例如,myprog.exe >> myfile.txt)。
希望我没有记错!
【讨论】:
是否使用子系统:控制台或子系统:窗口取决于您是否要启动应用程序:
如果您想要在终端中启动应用程序时输出到终端的中间方式,请点击 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 类型)。如果您愿意,您也可以简单地使用pipe stdout and stderr to a console application(cat 的 Windows 版本运行良好)。
【讨论】: