Предотвращение закрытия окна консоли

До сих пор мы запускали программу либо в командной строке, либо в редакторе Eclipse. Однако программу можно запустить и двойным щелчком мыши на значке файла с программой. Если мы попробуем это сделать сейчас с программой test.exe из предыдущего раздела, то окно консоли откроется, а затем сразу закроется. Чтобы окно не закрывалось необходимо вставить инструкцию, ожидающую нажатие клавиши. Сделать это можно несколькими способами.

Первый способ заключается в использовании функции _getch() (листинг 2.12). Возвращаемое функцией значение можно проигнорировать. Прототип функции:

#include <conio.h>
int _getch(void);

Листинг 2.12. Использование функции _getch()

#include <iostream>
#include <conio.h>
#include <clocale>

int main() {
   std::setlocale(LC_ALL, "Russian_Russia.1251");
   std::cout << "Hello, world!" << std::endl;
   std::cout << "Для закрытия окна нажмите любую клавишу ... "
             << std::endl;
   _getch();
   return 0;
}
Обратите внимание

Второй способ заключается в использовании функции system() (листинг 2.13). Эта функция позволяет передать команду операционной системе. Для вывода строки Для продолжения нажмите любую клавишу и ожидания нажатия клавиши предназначена команда pause. Прототип функции:

#include <process.h>
int system(const char *command);

Листинг 2.13. Использование функции system()

#include <iostream>
#include <clocale>
#include <process.h>

int main() {
   std::setlocale(LC_ALL, "Russian_Russia.1251");
   std::cout << "Hello, world!" << std::endl;
   system("pause");
   return 0;
}

Два предыдущих способа требовали подключения дополнительных файлов. Кроме того, функция _getch() может не поддерживаться компилятором, а функция system() выполняет много лишних операций. Вместо этих способов лучше использовать метод get() объекта cin. Этот метод позволяет получить введенный символ. Ввод осуществляется после нажатия клавиши <Enter>. Возвращаемое функцией значение можно проигнорировать. Прототип метода:

#include <iostream>
int get();

При использовании метода get() следует учитывать один нюанс. Если в программе производился ввод данных, то в буфере могут остаться символы. В этом случае первый символ автоматически будет передан методу get() и окно консоли сразу закроется. Поэтому после ввода данных необходимо дополнительно использовать метод ignore(). Прототип метода:

#include <iostream>
istream &ignore(streamsize n=1, int_type delim=EOF);

Первый параметр задает максимальное количество считываемых из буфера символов (по умолчанию один символ). Второй параметр задает символ-разделитель. Если символ-разделитель встретится раньше, чем будет считано указанное количество символов, то считывание прекращается. Метод возвращает ссылку на поток вывода.

В большинстве случаев достаточно игнорировать один символ (обычно символ перевода строки), указав название метода без параметров:

std::cin.ignore().get();

Однако в буфере могут остаться и другие символы. Поэтому лучше проигнорировать сразу несколько символов, указав их количество (например, 200) в первом параметре, а символ перевода строки во втором:

std::cin.ignore(200, '\n').get();

Если ввода данных не было, то достаточно использовать только метод get(). Пример использования методов get() и ignore() приведен в листинге 2.14.

Листинг 2.14. Использование методов get() и ignore()

#include <iostream>
#include <clocale>

int main() {
   std::setlocale(LC_ALL, "Russian_Russia.1251");
   std::cout << "Hello, world!" << std::endl;
   std::cout << "Для закрытия окна нажмите <Enter> ... " << std::endl;
   std::cin.get(); // Если не было ввода данных
   // std::cin.ignore(200, '\n').get(); // Если был ввод данных
   return 0;
}

Если нужно предотвратить закрытие окна только на этапе отладки программы, то можно создать вспомогательный файл с расширением bat и внутри него запускать программу. После инструкции запуска программы вставляем команду pause, которая выведет строку Для продолжения нажмите любую клавишу и будет ожидать нажатия клавиши. Пример:

@echo off
title Запуск программы test.exe
set Path=C:\msys64\mingw64\bin;%Path%
echo Результат:
@echo.
test.exe -param1 -param2
@echo.
@echo.
pause

Как видно из примера, после названия программы мы можем передать параметры. Если программа test.exe расположена в другом каталоге, то перед именем программы следует указать путь к ней.

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов