C 防止在Visual Studio中关闭控制台窗口

C 防止在Visual Studio中关闭控制台窗口,c,visual-studio,console,C,Visual Studio,Console,我对Visual Studio中的一个项目有问题。该项目被创建为空项目,然后添加了一个.c文件。问题是,当我将输入重定向到文件时,程序结束后控制台立即关闭 我试图进入Properties>Linker>System并选择/SUBSYSTEM:CONSOLE选项,但没有解决这个问题。这对我一直有效,但现在当我重定向输入时,控制台在程序执行后立即关闭,我看不到输出 我通过添加Debugger>Command重定向了输出,它完全按照我想要的方式工作,只是控制台关闭得太早了。重定向输出时不会出现此问题

我对Visual Studio中的一个项目有问题。该项目被创建为空项目,然后添加了一个.c文件。问题是,当我将输入重定向到文件时,程序结束后控制台立即关闭

我试图进入
Properties>Linker>System
并选择
/SUBSYSTEM:CONSOLE
选项,但没有解决这个问题。这对我一直有效,但现在当我重定向输入时,控制台在程序执行后立即关闭,我看不到输出

我通过添加
Debugger>Command
重定向了输出,它完全按照我想要的方式工作,只是控制台关闭得太早了。重定向输出时不会出现此问题

使用
getchar()
scanf(…)
系统(“暂停”)
也不起作用

我很想通过改变一些项目设置来解决这个问题,如果可能的话,不需要向程序中添加额外的代码,但是任何解决方案都是值得赞赏的


编辑:如前所述,我尝试过几种方法,包括类似问题的一些答案,但都没有帮助。

标准的windows行为是,控制台程序在未从现有控制台窗口启动时自动获取一个新的控制台窗口,并且该新窗口在程序结束时自动关闭。因此,强制窗口保持打开状态的关键是防止程序终止

对于像
getchar()
这样的东西,您依赖于这样一个事实,即这些调用阻塞,直到有更多的输入可用。只要输入实际上来自控制台,这就可以正常工作。但是,当您将输入重定向到来自文件时,总会有可用的输入——要么从文件中读取更多的内容,要么您会立即收到错误(例如EOF)。这就是所有这些“把戏”不再奏效的原因

一个简单且非常不干净的版本就是在程序末尾添加一个空循环,这样它就永远不会退出。在windows平台上,这可能类似于

for (;;) Sleep(1000);
调用
Sleep()
(包括使用
windows.h
)可确保此循环不会消耗CPU周期。您必须通过按Ctrl+C或关闭窗口来强制结束程序。当然,不要在您的最终程序中留下这个循环,从现有的控制台窗口启动时会非常烦人


这个问题可能有更好的解决方案,但我希望我能向您解释为什么会发生这种情况。

非常感谢您,至少现在我知道发生了什么。我知道那些
getchar()
方法不适用于此,但我必须尝试任何东西,我写了它,这样人们就不会建议我已经尝试过的东西。还有一件事,你们是说为了解决这个问题,我必须阻止程序终止,还是仅仅是一个想法?我只是想知道我是应该继续寻找答案还是解决这个问题。再次感谢您快速准确的回答。事实上,一旦您的程序终止,为它创建的控制台窗口就消失了。当然,您可以尝试让visual studio在
CMD/k[command]
中运行您的程序,在这种情况下,CMD将在程序终止后继续运行,因此窗口将保持不变。但我不确定这是否可行……是否
GetFileType(GetStdHandle(STD\u INPUT\u HANDLE))
help?如果您重定向了文件,这将返回
文件类型\u盘
0x0001
),或者控制台输入的
文件类型\u字符
0x0002
)。还有一件事还不清楚:您基本上是在问为什么Visual Studio在程序完成时关闭控制台?我一定会试试。对不起,我不够清楚,我的问题是如何防止这种情况发生,如果可能的话。在下面的回答中,Felix解释了那里到底发生了什么。我不认为这里建议的重复匹配,那里没有重定向的stdin。