C ++ - держать окно консоли открытым? - PullRequest
36 голосов
/ 15 декабря 2009

Мой вопрос очень прост, но я перехожу с C # на C ++, и мне было интересно, какая команда удерживает окно консоли открытым в C ++?

Я знаю в C #, самый простой способ:

Console.ReadLine();

Или, если вы хотите, чтобы пользователь нажимал любую клавишу, это:

Console.ReadKey(true);

Как вы делаете это в C ++? Единственная причина, по которой я задаю этот простой вопрос, заключается в том, что я не смог найти хорошего и ясного ответа в Интернете.

Ответы [ 11 ]

63 голосов
/ 15 декабря 2009

Как насчет std::cin.get();?

Кроме того, если вы используете Visual Studio, вы можете работать без отладки (по умолчанию CTRL-F5), и в конце консоль не закроется. Если вы запускаете его с отладкой, вы всегда можете поставить точку останова на закрывающей скобке main().

22 голосов
/ 15 декабря 2009

Правильный путь

cin.get();

cin.get() совместим с C ++ и переносим. Он извлечет следующий символ из стандартного ввода (стандартный ввод). Пользователь может нажать Enter, и ваша программа продолжит выполнение или прекратит работу в нашем случае.

Microsoft берет

У 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");

Это выполнит команду Windows 'pause', породив новый процесс cmd.exe / command.com в вашей программе. Это совершенно не нужно, а также не переносимо, поскольку команда pause зависит от Windows. К сожалению, я много видел это.

getch();

Это не является частью стандартной библиотеки C / C ++. Это просто расширение компилятора, и некоторые компиляторы не будут его поддерживать.

8 голосов
/ 03 января 2012

Если ваша проблема заключается в сохранении окна консоли в Visual Studio без изменение вашего приложения (c-код) и запускаем его с помощью Ctrl + F5 (при запуске Ctrl + F5), но окно все еще закрывается основной совет - установить параметр компоновщика / SUBSYSTEM: CONSOLE в вашем проекте Visual Studio.

как объяснил DJMooreTX в http://social.msdn.microsoft.com/Forums/en-US/vcprerelease/thread/21073093-516c-49d2-81c7-d960f6dc2ac6

1) Откройте ваш проект и перейдите в Solution Explorer. Если вы следите за мной в K & R, ваше «Решение» будет «Привет» с одним проектом под ним, также «Привет» выделено жирным шрифтом.

  1. Щелкните правой кнопкой мыши на «привет» (или как называется ваш проект).

  2. Выберите «Свойства» в контекстном меню.

  3. Выберите «Свойства конфигурации»> «Линкер»> «Система».

  4. Для свойства «Подсистема» в правой панели щелкните раскрывающийся список в правом столбце.

  5. Выберите «Консоль (/ SUBSYSTEM: CONSOLE)»

  6. Нажмите Применить, подождите, пока он закончит делать все, что он делает, затем нажмите OK. (Если «Применить» выделено серым цветом, выберите другой параметр подсистемы, нажмите «Применить», затем вернитесь и примените параметр консоли. Мой опыт показывает, что само по себе «ОК» не будет работать.)

Теперь выполните Борис CTRL-F5, подождите, пока ваша программа скомпилируется и скомпонует, найдите окно консоли под всем остальным мусором на вашем рабочем столе и прочитайте вывод вашей программы, а затем любимую «Нажмите любую клавишу, чтобы продолжить. ... "подсказка.

Опять же, CTRL-F5 и подсказки подсистемы работают вместе; они не являются отдельными вариантами.

4 голосов
/ 15 декабря 2009

Более подходящий метод - использовать std::cin.ignore:

#include <iostream>

void Pause()
{
   std::cout << "Press Enter to continue...";
   std::cout.flush();
   std::cin.ignore(10000, '\n');
   return;
}
2 голосов
/ 15 декабря 2009

Вы также можете немного опереться на IDE. Если вы запустите программу с помощью команды «Начать без отладки» (для меня Ctrl + F5), окно консоли останется открытым даже после того, как программа завершит работу «Нажмите любую клавишу для продолжения ...» сообщение.

Конечно, если вы хотите использовать "Нажать любую клавишу", чтобы ваша программа работала (то есть поддерживать поток), это не сработает. И это не работает, когда вы запускаете "с отладкой". Но тогда вы можете использовать точки останова, чтобы держать окно открытым.

1 голос
/ 07 февраля 2014

Как говорит Томас, игнорирование чина - хороший способ. Чтобы всегда ждать, пока пользователь нажмет ввод (даже если используется выход), зарегистрируйте функцию 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;
}
1 голос
/ 07 февраля 2014

Я использую 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;
}
1 голос
/ 15 декабря 2009

В Windows вы можете использовать _getch() в

<conio.h>

заголовок.

0 голосов
/ 10 марта 2012

Эй, прежде всего, чтобы включить функции 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();
  }

спасибо

0 голосов
/ 15 декабря 2009

Примерно такие же вещи, которые вы делали в C #. Вызов getch(), вероятно, самый простой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...