在Linux上使用C ++中的iostream时,它会在终端中显示程序输出,但在Windows中,它只是将输出保存到stdout.txt文件中。如何在Windows中使输出显示在控制台中?
答案 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非控制台应用程序。
答案 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)
是否使用子系统:控制台或子系统:窗口类型取决于您是否要启动应用程序:
如果您希望输出到终端的中间路径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)
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();