Страницы

Поиск по вопросам

пятница, 3 января 2020 г.

Пауза консоли в C++

#cpp #visual_cpp #консоль


Какие функции в Visual Studio (помимо system("pause");) останавливают закрытие консоли. 
    


Ответы

Ответ 1



Если речь идет только о работе в IDE, для приостановки работы программы можно использовать обычные точки останова и отладчик, какие-то специальные вызовы в коде не нужны. Более того, использование вызовов типа system("pause") приведет к тому, что программу невозможно будет нормально вызывать из пакетных файлов: она будет каждый раз ждать ввода с реальной консоли, даже если стандартный ввод перенаправлен из файла и ожидалась работа без участия пользователя. Но, если все же действительно нужно приостановить консоль при любом запуске программы, есть несколько вариантов: system("PAUSE"); Особенности: Отображает приглашение ввода ("Нажмите любую клавишу") Прерывает работу программы до нажатия любой клавиши Работает только под Windows (в других ОС нет команды PAUSE) Внутренне вызывает командный интерпретатор, поэтому считается "тяжелым" вариантом (если производительность что-то значит в данном случае) Есть миф, что такой вызов небезопасен, так как если поместить в папку с программой вредоносный файл pause.exe, он будет вызван вместо команды PAUSE. Это не так в современных версиях Windows. system("PAUSE>nul"); То же самое, но не отображает приглашение ввода. getchar(); //С cin.get(); //C++ Особенности: Не отображает приглашение ввода Прерывает работу программы до нажатия клавиши Enter Стандартная функция - работает в любом окружении В отличие от других вариантов, не ломает перенаправление стандартного ввода (достаточно поместить на вход строку любого содержания, и выполнение программы пойдет дальше). #include getch(); //Традиционная _getch(); //Современный вариант Особенности: Не отображает приглашение ввода Прерывает работу программы до нажатия любой клавиши Нестандартная функция, доступна в DOS и Windows (в других ОС есть похожие аналоги) Опять же, существует миф, что в Windows это какой-то DOSовский вызов и использовать его - дикий криминал. На самом деле, внутренне он реализуется как обычный вызов WINAPI-функции ReadConsoleInput, с предварительным отключением у консоли режима ENABLE_LINE_INPUT. Убедиться в этом можно, заглянув в исходники отладочной версии CRT, которые с некоторого времени частично открыты.

Комментариев нет:

Отправить комментарий