Всем привет!
Как я могу заменить следующие функции или вызовы ОС?
system("CLS");
system("PAUSE");
Это потому, что мне сказали, что использование вызовов ОС — плохая практика. Хотя он всегда определял ОС с помощью условных выражений и в зависимости от того, какое из них, модифицировал команду.
Многие говорили мне использовать функцию cin
, но с ее помощью я могу нормально печатать. Есть ли способ избежать этого?:
Примечание. Я не хочу использовать библиотеку conio.h для решения этой проблемы.
Объяснение проблемы
Обработка терминала различается между платформами, поэтому необходимо использовать группы
#ifdef
для различения реализации в зависимости от платформы, на которой скомпилировано ваше приложение.Блочное решение
#ifdef
Вы можете проверить, как выполнить задачу в разных операционных системах, в связанной статье . В нем вы найдете исходный код примеров, связанных с тем, как отключить эхо клавиатуры в Windows и Linux, поэтому вы можете использовать блок, подобный приведенному ниже, для достижения своей цели:
Пример (полученный из этого другого ответа stackoverflow ):
Пример использования:
Решение на основе
curses
(ncurses
/pdcurses
)Наконец, вы можете использовать
ncurses
илиpdcurses
(еще одна кросс-платформенная альтернатива) , чтобы выполнить работу:В примере я использую
getnstr()
для получения любой комбинации клавиш, пока не найду возврат каретки, напримерgetch()
. Можно было бы использовать функции, которые считывают по клавише, но это мне показалось самым быстрым для примера.Наконец, нужная вам работа выполняется функциями
noecho()
иecho()
, которые отключают и включают эхо нажатия клавиш соответственно.Хотя я не являюсь экспертом (или чем-то подобным) в C++, я собираюсь ответить на ваш вопрос тем немногим, что знаю, потому что в то время у меня также были аналогичные опасения по поводу использования функций
system("pause")
иsystem("cls")
.Начнем с того, что по отношению к функции
system("pause")
вы можете использовать функциюcin.get()
, которая в основном позволяет вам читать символ, который вы вводите с клавиатуры (более точную информацию вы можете проверить по следующей ссылке ). Способ его использования будет аналогичен примеру, приведенному пользователем akko в другом ответе.Или вы также можете использовать его следующим образом в сочетании с функцией
cin.ignore()
:Теперь, что касается функции
system("cls)
, к сожалению, в C++ нет функции, позволяющей «очистить» экран. Если я не ошибаюсь, я понимаю, что C++ создавался для использования в самом общем виде на разных платформах, многие из которых даже не имеют экрана или чего-то подобного. В том случае, если может быть реализована функция, отвечающая за очистку экрана, такая функция обязательно должна зависеть от ОС и, следовательно, не будет переносимой.Как я читал, если вы используете ОС на основе Unix, вы можете использовать библиотеку , в
ncurses
которой есть функция очистки экрана. В случае с Windows вы можете использовать библиотекуpdcurses
, аналогичную библиотекеncurses
(хочу отметить, что я не использовал такие библиотеки, поэтому я не могу гарантировать ничего, кроме того, что я прочитал). Однако, как я писал выше, такие решения зависят от ОС.Альтернативой, которая может работать в Windows для очистки экрана, является эмуляция того, что
system("cls")
. Вот код (взято отсюда ):Я проверил это на себе, и это работает довольно хорошо.
Для замены
system("pause")
можно сделать следующее.