繁体   English   中英

C ++ - 保持控制台窗口打开?

[英]C++ - Hold the console window open?

我的问题非常简单,但是我正在从C#转换到C ++,我想知道什么命令在C ++中打开控制台窗口?

我知道在C#中,最基本的方法是:

Console.ReadLine();

或者,如果您想让用户按任意键,则:

Console.ReadKey(true);

你是如何用C ++做到的? 我在这里问这个简单问题的唯一原因是,我无法在互联网上找到一个好的和明确的答案。

怎么样std::cin.get();

此外,如果您使用的是Visual Studio,则无需调试即可运行(默认情况下为CTRL-F5),并且最终不会关闭控制台。 如果你通过调试运行它,你总是可以在main()的右括号中放置一个断点。

正确的方式

cin.get();

cin.get()符合C ++,可移植。 它将从标准输入(stdin)中检索下一个字符。 用户可以按回车键,然后您的程序将继续执行,或在我们的情况下终止。

微软的看法

Microsoft有一篇名为“ 防止控制台窗口消失 ”的知识库文章。 它描述了如何仅在必要时暂停执行,即仅当用户通过从资源管理器执行程序生成新的控制台窗口时。 代码在C中,我在这里重现:

#include <windows.h>
#include <stdio.h>
#include <conio.h>

CONSOLE_SCREEN_BUFFER_INFO csbi;
HANDLE hStdOutput;
BOOL bUsePause;

void main(void)
{
        hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
        if (!GetConsoleScreenBufferInfo(hStdOutput, &csbi))
        {
                printf("GetConsoleScreenBufferInfo failed: %d\n", GetLastError());
                return;
        }

        // if cursor position is (0,0) then use pause
        bUsePause = ((!csbi.dwCursorPosition.X) &&
                     (!csbi.dwCursorPosition.Y));

        printf("Interesting information to read.\n");
        printf("More interesting information to read.\n");

        // only pause if running in separate console window.
        if (bUsePause)
        {
                int ch;
                printf("\n\tPress any key to exit...\n");
                ch = getch();
        }
}

我自己也用过它,这是一个很好的方法,当然只能在windows下使用它。 另请注意,您可以使用以下命令启动程序,在Windows下以非编程方式实现此目的:

cmd /K consoleapp.exe

错误的方法

请勿使用以下任何方法来实现此目的:

system("PAUSE");

这将通过在程序中生成新的cmd.exe / command.com进程来执行windows命令'pause'。 由于pause命令是特定于窗口的,因此这是完全不必要的并且也是不可移植的。 不幸的是,我已经看过很多了。

getch();

这不是C / C ++标准库的一部分。 它只是一个编译器扩展,一些编译器不支持它。

如果您的问题是在Visual Studio中保留控制台窗口而不修改您的应用程序(c代码)并使用Ctrl + F5运行它(当运行Ctrl + F5时)但窗口仍在关闭,则主要提示是设置/ SUBSYSTEM :Visual Studio项目中的CONSOLE链接器选项。

正如DJMooreTX在http://social.msdn.microsoft.com/Forums/en-US/vcprerelease/thread/21073093-516c-49d2-81c7-d960f6dc2ac6中所解释

1)打开项目,然后转到解决方案资源管理器。 如果您在K&R跟随我,您的“解决方案”将是“hello”,其中包含1个项目,也是“hello”的粗体。

  1. 右键单击“hello”(或任何项目名称)。

  2. 从上下文菜单中选择“属性”。

  3. 选择“配置属性>链接器>系统”。

  4. 对于右侧窗格中的“子系统”属性,请单击右侧列中的下拉框。

  5. 选择“控制台(/ SUBSYSTEM:CONSOLE)”

  6. 单击“应用”,等待它完成所做的任何操作,然后单击“确定”。 (如果“Apply”显示为灰色,请选择其他子系统选项,单击Apply,然后返回并应用控制台选项。我的经验是OK本身不起作用。)

现在做Boris的CTRL-F5,等待你的程序编译和链接,找到桌面上所有其他垃圾下的控制台窗口,然后阅读程序的输出,然后是心爱的“按任意键继续...... “提示。

同样,CTRL-F5和子系统提示一起工作; 它们不是单独的选择。

更合适的方法是使用std::cin.ignore

#include <iostream>

void Pause()
{
   std::cout << "Press Enter to continue...";
   std::cout.flush();
   std::cin.ignore(10000, '\n');
   return;
}

您也可以稍微依靠IDE。 如果你使用“Start without debugging”命令运行程序(对我来说是Ctrl + F5),即使程序以“按任意键继续......”结束,控制台窗口也会保持打开状态。 信息。

当然,如果想使用“命中任意键”来保持程序运行(即保持线程处于活动状态),这将无法正常工作。 当你运行“with debugging”时它不起作用。 但是,您可以使用断点来保持窗口打开。

在Windows中,您可以使用_getch()

<conio.h>

头。

我在我的环境中使用std::getwchar() ,这是使用mingw32 - gcc-4.6.2编译器,这是一个示例代码。

#include <iostream>
#include "Arithmetics.h"

using namespace std;

int main() {
    ARITHMETICS_H::testPriorities();

    cout << "Press any key to exit." << endl;
    getwchar();
    return 0;
}

正如托马斯所说的那样,cin忽视是一种好方法。 要始终等待用户按Enter键(即使使用退出),请注册一个函数atexit:

#include <iostream>

void pause()
{   ::std::cout<<"\nPress ENTER to exit.";
    ::std::cin.sync();
    if(::std::cin.get()!='\n')
        ::std::cin.ignore(0xFFFFFFFF,'\n');
}

int main()
{
    atexit(pause);

    // whatever

    return 0;
}

如果您创建控制台应用程序,控制台将保持打开状态,直到您关闭应用程序。

如果您已经创建了一个应用程序并且您不知道如何打开控制台,则可以在项目配置 - >链接器 - >系统中将子系统更改为控制台(/ Subsystem:Console)。

你在C#中完成的事情大致相同。 调用getch()可能是最简单的。

首先要包括你应该使用的c ++函数

包括<iostream.h>而不是stdio .h

 and to hold the output screen there is a simple command getch(); here, is an example: 
   #include<iostream.h>
   #include<conio.h>
   void main()  \\or int main(); if you want
  {
    cout<<"c# is more advanced than c++";
    getch();
  }

谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM