Как задержать консоль в visual studio
Теперь я просто попробовал Пример 1 (здесь - ссылка на MSDN ), и я столкнулся с проблемой: почему окно консоли сразу же закрывается после отображения моего вывода?
22 ответа
проблема в том, что их программа Hello World отображается, а затем немедленно закрывается.
это почему?
Потому что это завершено. Когда консольные приложения завершили выполнение и вернулись из своего метода main , соответствующее окно консоли автоматически закрывается. Это ожидаемое поведение.
Если вы хотите оставить его открытым для целей отладки, вам нужно указать компьютеру дождаться нажатия клавиши перед завершением работы приложения и закрытием окна.
Метод Console.ReadLine - это один из способов делая это. Добавление этой строки в конец вашего кода (непосредственно перед оператором return ) заставит приложение ждать, пока вы нажмете клавишу, перед выходом.
В качестве альтернативы вы можете запустить приложение без подключенного отладчика, нажав Ctrl + F5 из среды Visual Studio, но это имеет очевидный недостаток, который не позволяет вам использовать отладку. функции, которые вы, вероятно, захотите использовать при написании приложения.
Лучшим компромиссом, вероятно, является вызов метода Console.ReadLine только при отладке приложения путем включения его в директиву препроцессора. Что-то типа:
Вы также можете захотеть, чтобы окно оставалось открытым в случае возникновения неперехваченного исключения. Для этого вы можете поместить Console.ReadLine(); в блок finally :
По моему мнению, если мы хотим стабилизировать ВЫВОД КОНСОЛЬНОГО ПРИЛОЖЕНИЯ до закрытия вывода, отобразите USE, метку: после MainMethod и метку goto; до окончания программы
Если ваша программа требует, чтобы вы нажали Enter, чтобы продолжить, как если бы вам нужно было ввести значение и продолжить, добавьте новый тип double или int и введите write перед retunr (0); scanf_s ("% lf", & переменная);
Добавьте следующее перед возвращением 0:
Это печатает строку для нажатия клавиши, чтобы закрыть окно. Окно будет отображаться до тех пор, пока вы не нажмете клавишу ввода. Я прошу своих студентов добавить его во все свои программы.
Вы можете решить это очень простым способом, просто вызвав ввод. Однако, если вы нажмете Enter , консоль снова отключится. Просто используйте это Console.ReadLine(); или Console.Read();
Чтобы упростить то, что говорят другие: Используйте Console.ReadKey(); .
Это делает так, что программа ждет, когда пользователь нажмет обычную клавишу на клавиатуре.
Источник: использую в своих программах для консольных приложений.
Я всегда добавляю следующий оператор в консольное приложение. (Создайте для этого фрагмент кода, если хотите)
Это помогает, когда вы хотите поэкспериментировать с разными концепциями через консольное приложение.
Ctrl + F5 заставит консоль остаться, но вы не сможете отлаживать! Все консольные приложения, которые я написал в реальном мире, всегда не интерактивны и запускаются планировщиком, таким как TWS или CA Workstation, и не требуют чего-то подобного.
Инструменты -> Параметры -> Отладка -> Общие -> Автоматически закрывать консоль (5-я последняя опция)
Установите флажок и закройте
Это относилось ко всем проектам.
Что-либо, где бы то ни было в консольном приложении, никогда не используйте await , а вместо этого используйте theAsyncMethod().GetAwaiter().GetResult(); ,
Программа закрывается, как только завершится ее выполнение. В этом случае, когда вы return 0; . Это ожидаемая функциональность. Если вы хотите увидеть результат, либо запустите его в терминале вручную, либо установите ожидание в конце программы, чтобы оно оставалось открытым в течение нескольких секунд (с использованием библиотеки потоков).
Вот способ сделать это без участия Console :
Добавьте метод Read для отображения вывода.
Используйте Console.Read (); чтобы предотвратить закрытие программы, но убедитесь, что вы добавили код Console.Read(); перед оператором return, иначе это будет недостижимый код.
Код готов, чтобы продолжить, вам нужно добавить это:
Другой способ - использовать Debugger.Break() перед возвратом из метода Main
В качестве альтернативы вы можете отложить закрытие, используя следующий код:
Обратите внимание, что Sleep использует миллисекунды.
Если вы хотите, чтобы ваше приложение оставалось открытым, вам нужно что-то сделать, чтобы поддерживать его процесс. Приведенный ниже пример - самый простой, который можно поместить в конец вашей программы:
Однако это вызовет перегрузку процессора, так как он вынужден бесконечно повторяться.
На этом этапе вы можете выбрать использование класса System.Windows.Forms.Application (но для этого потребуется добавить ссылку System.Windows.Forms ):
Это не приводит к утечке ЦП и успешно работает.
Чтобы избежать добавления ссылки System.Windows.Forms , вы можете использовать простой трюк, так называемое ожидание вращения , импортировав System.Threading :
Это также отлично работает и в основном состоит из цикла while с отрицательным условием, которое возвращается указанным выше лямбда-методом. Почему это не перегружает процессор? Вы можете посмотреть исходный код здесь; в любом случае, он в основном ожидает некоторого цикла ЦП перед повторением.
Затем вы можете безопасно выполнить цикл, выполнив что-то вроде этого:
Программа немедленно закрывается, потому что ничто не мешает ей закрыться. Вставьте точку останова в return 0; или добавьте Console.Read(); перед return 0; , чтобы программа не закрывалась.
То же самое для Ctrl F5 или F5 . Поместите непосредственно перед концом метода Main .
Я предполагаю, что причина, по которой вы не хотите, чтобы он закрывался в режиме отладки, заключается в том, что вы хотите посмотреть значения переменных и т. Д. Так что, вероятно, лучше просто вставить точку останова на закрытии ">" основной функции . Если вам не нужно отлаживать, тогда Ctrl-F5 - лучший вариант.
Вместо того, чтобы использовать
Вы можете запустить свою программу, используя Ctrl + F5 (если вы находитесь в Visual Studio). Тогда Visual Studio будет держать окно консоли открытым, пока вы не нажмете клавишу.
Какие функции в Visual Studio (помимо system("pause"); ) останавливают закрытие консоли.
Если речь идет только о работе в IDE, для приостановки работы программы можно использовать обычные точки останова и отладчик, какие-то специальные вызовы в коде не нужны. Более того, использование вызовов типа system("pause") приведет к тому, что программу невозможно будет нормально вызывать из пакетных файлов: она будет каждый раз ждать ввода с реальной консоли, даже если стандартный ввод перенаправлен из файла и ожидалась работа без участия пользователя. Но, если все же действительно нужно приостановить консоль при любом запуске программы, есть несколько вариантов:
- Отображает приглашение ввода ("Нажмите любую клавишу")
- Прерывает работу программы до нажатия любой клавиши
- Работает только под Windows (в других ОС нет команды PAUSE)
- Внутренне вызывает командный интерпретатор, поэтому считается "тяжелым" вариантом (если производительность что-то значит в данном случае)
Есть миф, что такой вызов небезопасен, так как если поместить в папку с программой вредоносный файл pause.exe, он будет вызван вместо команды PAUSE. Это не так в современных версиях Windows.
То же самое, но не отображает приглашение ввода.
- Не отображает приглашение ввода
- Прерывает работу программы до нажатия клавиши Enter
- Стандартная функция - работает в любом окружении
В отличие от других вариантов, не ломает перенаправление стандартного ввода (достаточно поместить на вход строку любого содержания, и выполнение программы пойдет дальше).
- Не отображает приглашение ввода
- Прерывает работу программы до нажатия любой клавиши
- Нестандартная функция, доступна в DOS и Windows (в других ОС есть похожие аналоги)
Опять же, существует миф, что в Windows это какой-то DOSовский вызов и использовать его - дикий криминал. На самом деле, внутренне он реализуется как обычный вызов WINAPI-функции ReadConsoleInput, с предварительным отключением у консоли режима ENABLE_LINE_INPUT. Убедиться в этом можно, заглянув в исходники отладочной версии CRT, которые с некоторого времени частично открыты.
У меня есть коллекция модульных тестов Boost, которые я хочу запустить как консольное приложение.
когда я работаю над проектом и запускаю тесты, я хотел бы иметь возможность отлаживать тесты, и я хотел бы, чтобы консоль оставалась открытой после запуска тестов.
Я вижу, что если я запускаю в режиме выпуска, окно консоли остается после выхода программы, но в режиме отладки это не так.
Я не хочу добавлять ' system ("pause"); ' или любые другие хаки как чтение персонажа в моей программе. Я просто хочу сделать паузу Visual Studio после запуска тестов с отладкой, как если бы я работал в режиме выпуска. Мне также хотелось бы, чтобы выходные данные тестов были захвачены в одном из выходных окон Visual Studio, но это также кажется сложнее, чем должно быть.
Как я могу это сделать?
Boost test предлагает следующее рекомендации по использованию Visual Studio это позволит вам автоматически запускать модульные тесты в конце компиляции и записывать выходные данные в окно сборки.
хороший побочный эффект этого трюка заключается в том, что он позволяет рассматривать ошибки тестирования как ошибки компиляции. ". вы можете перейти через эти ошибки, используя обычные сочетания клавиш / щелчки мыши, которые вы используете для анализа ошибок компиляции. "
попробуйте запустить приложение с Ctrl + F5 комбинации.
http://connect.microsoft.com/VisualStudio/feedback/details/540969/missing-press-any-key-to-continue-when-lauching-with-ctrl-f5
в старых версиях он будет по умолчанию для консольной подсистемы, даже если вы выбрали "пустой проект", но не в 2010 году, поэтому вам нужно установить его вручную. Для этого выберите проект в обозревателе решений справа или слева (наверное уже выбран, поэтому вам не придется беспокоиться об этом). Затем выберите "проект" из списка строка меню выпадающие меню, затем выберите"имя_проекта свойства " > "свойства конфигурации" > "компоновщик" > " система "и установите первое свойство, раскрывающееся свойство" подсистема "в"консоль (/SUBSYSTEM:CONSOLE)". Окно консоли теперь должно оставаться открытым после выполнения, как обычно.
установите точку останова в последней строке кода.
Я только что скопировал из http://social.msdn.microsoft.com/forums/en-US/Vsexpressvc/thread/1555ce45-8313-4669-a31e-b95b5d28c787/?prof=required:
следующие работы для меня :-)
/////////////////////////////////////////////////////////////////////////////////////
вот еще одна причина, по которой консоль может исчезнуть. И решение:
с новой Visual Studio 2010 Вы можете увидеть это поведение даже при использовании Ctrl + F5 он же "запуск без отладки". Скорее всего, это связано с тем, что вы создали "пустой проект" вместо "консольного приложения Win32". Если вы создаете проект как "консольное приложение Win32" вы можете игнорировать это, пока это не касается.
в более старых версиях это будет по умолчанию для консольной подсистемы, даже если вы выбрали "пустой проект", но не в Visual Studio 2010, поэтому вам нужно установить его вручную. Для этого выберите проект в обозреватель решений справа или слева (вероятно, уже выбран, поэтому вам не нужно беспокоиться об этом).
затем выберите " проект "из выпадающего меню Меню, затем выберите"имя_проекта свойства " → "свойства конфигурации" → "компоновщик" → " система "и установите первое свойство, раскрывающееся свойство" подсистема "на"консоль (/SUBSYSTEM:CONSOLE)". В окне консоли должен оставаться открытым после выполнения обычный.
/////////////////////////////////////////////////////////////////////////////////////
Если это консольное приложение, используйте Ctrl + F5 .
вы говорите, что не хотите использовать system("pause") рубить. Почему бы и нет?
если это потому, что вы не хотите, чтобы программа подскажет, когда это не будучи отлаженным, есть способ обойти это. Это работает для меня:
Я просто вставляю этот код в каждое новое консольное приложение, которое я пишу. Если программа запускается из командного окна, положение курсора не будет , и не atexit() . Если он был запущен с вашего отладчика (любой отладчик) положение курсора консоли будет и atexit() вызов будет выполнен.
Я получил идею из примера программы, которая раньше была в библиотеке MSDN, но я думаю, что она была удалена.
Примечание: реализация программы system() в Microsoft Visual Studio требует, чтобы переменная среды COMSPEC идентифицировала интерпретатор командной строки. Если эта переменная среды будет испорчена - например, если у вас возникла проблема в Visual Studio отладочные свойства проекта, чтобы переменные среды не передавались должным образом при запуске программы-тогда он просто не будет работать молча.
Я бы использовал команду"wait" -в течение определенного времени (миллисекунд) по вашему собственному выбору. Приложение выполняется до строки, которую вы хотите проверить, а затем продолжается после истечения времени.
включить :
вы также можете настроить свой исполняемый файл как внешний инструмент и пометить инструмент для использовать окне вывода. Таким образом, вывод инструмента будет виден в самой Visual Studio, а не в отдельном окне.
Я запускаю приложение с F11 и получаю точку останова где-то в unit_test_main.ИПП (может быть ассемблерный код). Я использую shift-f11 (Step out) для запуска модульного теста и получения следующей инструкции по сборке в CRT (обычно в mainCRTStartup()). Я использую F9, чтобы установить точку останова на инструкции.
при следующем вызове я могу запустить приложение с помощью F5, и приложение сломается после запуска тестов, поэтому у меня есть возможность заглянуть в окно консоли
просто используйте библиотеку журналов, например log4net, и пусть она войдет в приложение для файлов.
сделайте readline в конце (это "forma cochina", как мы говорим в Колумбии, но это работает):
Это, вероятно, вопрос о запуске, поскольку, несомненно, ответ ослепительно очевиден.
Я использовал Visual Studio в течение многих лет, но это первый раз, когда я создал любую консольную программу.
Когда я запускаю приложение, появляется окно консоли, появляется выход программы, а затем окно закрывается по мере выхода приложения.
Есть ли способ открыть его, пока я не проверил вывод или не просмотрел результаты после закрытия окна?
ОТВЕТЫ
Ответ 1
Если вы запускаете без отладки (Ctrl + F5), то по умолчанию он предлагает вам нажать return, чтобы закрыть окно. Если вы хотите использовать отладчик, вы должны поставить точку останова в последней строке.
Ответ 2
Щелкните правой кнопкой мыши на вашем проекте
Свойства> Свойства конфигурации> Линкер> Система
Выберите Console (/SUBSYSTEM: CONSOLE) в опции SubSystem или вы можете просто ввести Console в текстовое поле!
Теперь попробуйте. это должно работать
Ответ 3
Вот способ для C/С++:
Ответ 4
Откройте меню отладки- > Нажмите Начать без использования
Ответ 5
Он будет ждать <ENTER> .
Ответ 6
попробуйте вызвать getchar() прямо перед возвратом main() .
Ответ 7
(/SUBSYSTEM: CONSOLE) не работал для моего vs2013 (у меня его уже было).
"run without debugging" не является параметром, так как я не хочу переключаться между отладкой и просмотром вывода.
Решение, используемое в qtcreator до 2.6. Теперь, когда qt растет, vs идет другим путем. Насколько я помню, в vs2008 нам не нужны такие трюки.
Ответ 8
Здесь решение, что (1) не требует каких-либо изменений кода или точек останова, и (2) приостанавливается после завершения программы, чтобы вы могли видеть все, что было напечатано. Он остановится после F5 или Ctrl + F5. Основной недостаток заключается в том, что на VS2013 Express (как проверено) он не загружает символы, поэтому отладка очень ограничена.
Создайте командный файл. Я назвал мой runthenpause.bat со следующим содержимым:
Первая строка будет запускать любую команду, которую вы предоставляете, и до восьми аргументов. Вторая строка будет. пауза.
Откройте свойства проекта | Конфигурационные свойства | Отладка.
Теперь, когда вы запустите, runthenpause.bat запустит ваше приложение, и после того, как ваше приложение завершится, вы остановитесь, чтобы увидеть вывод консоли.
Я опубликую обновление, если выясню, как загрузить символы. Я пробовал /Z7 за этот, но безуспешно.
Ответ 9
просто введите свою последнюю строку кода:
Ответ 10
Начиная с Visual Studio 2017 (15.9.4) есть опция:
Автоматически закрывать консоль, когда отладка прекращается:
Сообщает Visual Studio закрыть консоль в конце сеанса отладки.
Ответ 11
Вы можете запустить исполняемый файл из командной строки. Таким образом, вы можете увидеть весь вывод. Или вы можете сделать что-то вроде этого:
и таким образом окно не будет закрываться, пока вы не введете данные для переменной a .
Ответ 12
добавить "| pause" в поле аргументов команды в разделе отладки в свойствах проекта.
Ответ 13
Просто нажмите CNTRL + F5, чтобы открыть его во внешнем окне командной строки (Visual Studio не контролирует его).
Если это не сработает, добавьте следующее в конец вашего кода:
Подождите, пока вы нажмете клавишу, чтобы закрыть окно терминала, как только код достигнет конца.
Если вы хотите сделать это в нескольких местах, поместите вышеуказанный код в метод (например, private void Pause() ) и вызовите Pause() всякий раз, когда программа достигает возможного конца.
Ответ 14
Несколько лучшее решение:
в начале вашей программы.
- может использовать std:: exit()
- может иметь несколько возвратов из основного
- вы можете запустить свою программу под отладчиком
- Независимый IDE (+ независимый от ОС, если вы используете трюк cin.sync(); cin.ignore(); вместо system("pause"); )
- необходимо изменить код
- не будет останавливаться на std:: terminate()
- все равно произойдет в вашей программе вне сеанса IDE/debugger; вы можете предотвратить это под Windows, используя:
Ответ 15
Обязательно сделайте любой из них в конце функции main() и перед оператором return .
Ответ 16
В моем случае я испытал это, когда создал проект Empty C++ в версии VS 2017 для сообщества. Вам нужно будет установить для подсистемы значение "Консоль (/SUBSYSTEM: CONSOLE)" в разделе "Свойства конфигурации".
- Зайдите в "Просмотр", затем выберите "Менеджер недвижимости"
- Щелкните правой кнопкой мыши на проекте/решении и выберите "Свойство". Откроется страница свойств теста.
- Перейдите к компоновщику, затем выберите "Система"
- Нажмите "Подсистема" и появится выпадающий
- Выберите "Консоль (/SUBSYSTEM: CONSOLE)"
- Применить и сохранить
- В следующий раз, когда вы запустите свой код с помощью "CTRL +F5", вы должны увидеть результат.
Ответ 17
Вы также можете использовать эту опцию
Ответ 18
Ответ 19
Visual Studio 2015, импорт. Потому что я ненавижу когда примеры кода не дают необходимых импортов.
Читайте также: