Есть ли приличная функция ожидания в C++?

Первое, что я узнал в C++, было то, что

#include <iostream>
int main()
{
    std::cout<<"Hello, World!\n";
    return 0;
}

будет просто появляться и исчезать очень быстро без паузы. Чтобы предотвратить это, мне нужно было перейти в блокнот и сохранить

helloworld.exe
pause

аза

helloworld.bat

Это было утомительно, когда мне нужно было создать кучу небольших тестовых программ, и в итоге я просто while(true); в конце большинства моих тестовых программ, чтобы я мог видеть результаты. Есть ли лучшая функция ожидания, которую я могу использовать?

14 ответов

Решение

Вы можете попросить пользователя нажать Enter перед закрытием программы... что-то вроде этого работает.

#include <iostream>
int main()
{
  std::cout << "Hello, World\n";
  std::cin.ignore();
  return 0;
}

Cin читает пользовательский ввод, а функция.ignore() cin говорит программе просто игнорировать ввод. Программа продолжится, как только пользователь нажмет ввод.

Ссылка на сайт

Обратите внимание, что приведенный выше код был протестирован на Code::Blocks 12.11 и Visual Studio 2012
на Windows 7.

Для принудительного останова или ожидания вашей программы у вас есть несколько вариантов:


  • сон (без знака int)

Значение должно быть положительным целым числом в миллисекундах. Это означает, что если вы хотите, чтобы ваша программа ждала 2 секунды, введите 2000.

Вот пример:

#include <iostream>     //for using cout
#include <stdlib.h>     //for using the function sleep

using namespace std;    //for using cout

int main(void)         
{
   cout << "test" << endl;
   sleep(5000);         //make the programme waiting for 5 seconds
   cout << "test" << endl;
   sleep(2000);         // wait for 2 seconds before closing

   return 0;
}

Если вы ждете слишком долго, это, вероятно, означает, что параметр находится в секундах. Так что измените это на это:

sleep(5);

Для тех, кто получает сообщение об ошибке или проблему с использованием сна, попробуйте заменить его на _sleep или Sleep, особенно в Code:: Bloks.
И если у вас все еще возникают проблемы, попробуйте добавить одну эту библиотеку в начале кода.

#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <dos.h>
#include <windows.h>

  • Система ("Пауза")

Простая программа "Hello world" в консольном приложении Windows, вероятно, закроется, прежде чем вы сможете что-либо увидеть. Это тот случай, когда вы можете использовать систему ("Пауза").

#include <iostream>    

using namespace std;   

int main(void)         
{
    cout << "Hello world!" << endl;

    system("PAUSE");

    return 0;
}

Если вы получили сообщение "ошибка:" система "не была объявлена ​​в этой области", просто добавьте следующую строку в начале кода:

#include <cstdlib>

  • cin.ignore ()

Тот же результат может быть достигнут с помощью cin.ignore ():

#include <iostream>     

using namespace std;    

int main(void)         
{
    cout << "Hello world!" << endl;

    cin.ignore();

    return 0;
}

  • cin.get ()

пример:

#include <iostream>     

using namespace std;    

int main(void)         
{
    cout << "Hello world!" << endl;

    cin.get();

    return 0;
}

  • Геч ()

Только не забудьте добавить библиотеку conio.h:

#include <iostream>     
#include <conio.h>    //for using the function getch()

using namespace std;    

int main(void)
{

    cout << "Hello world!" << endl;

    getch();

    return 0;
}

Вы можете получить сообщение о том, что вы должны использовать _getch() вместо getch

Многие люди предложили POSIX sleep Windows Sleep Windows system("pause"), C++ cin.get()... есть даже DOS getch() там, примерно с конца 1920-х годов.

Пожалуйста, не делайте ничего из этого.

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

Сохранение открытого окна консоли, чтобы вы могли прочитать вывод вашей программы, не является ответственностью вашей программы! Когда вы добавляете wait/sleep/block в конец вашей программы, вы нарушаете принцип единой ответственности, создавая большую утечку абстракции и уничтожая возможность повторного использования / цепочки вашей программы. Он больше не принимает входные данные и выдает выходные данные - он блокируется по временным причинам использования. Это очень нехорошо.

Вместо этого вы должны настроить свою среду так, чтобы приглашение оставалось открытым после завершения работы программы. Ваш пакетный скрипт является хорошим подходом! Я вижу, как было бы неприятно постоянно обновлять вручную, и вы не можете вызвать его из своей IDE. Вы можете сделать так, чтобы скрипт взял путь к программе для выполнения в качестве параметра, и сконфигурировал вашу IDE, чтобы вызывать ее вместо вашей программы напрямую.

Временным подходом быстрого старта было бы изменить команду запуска вашей IDE с cmd.exe <myprogram> или же <myprogram>, чтобы cmd.exe /K <myprogram>, /K переключиться на cmd.exe заставляет подсказку оставаться открытой после завершения программы по указанному пути. Это будет немного более раздражающим, чем решение Batch-скрипта, потому что теперь вам нужно набрать exit или нажмите на красную "X", когда вы закончите читать вывод вашей программы, вместо того, чтобы просто чмокать пробел.


Я предполагаю использование IDE, потому что в противном случае вы уже вызываете из командной строки, и это не было бы проблемой в первую очередь. Кроме того, я предполагаю использование Windows (основываясь на деталях, приведенных в вопросе), но этот ответ относится к любой платформе… что, впрочем, и половина дела.

Появление и исчезновение окна для отображения текста - это особенность того, как вы запускаете программу, а не C++.

Запускать в постоянной среде командной строки, или включить поддержку окон в вашей программе, или использовать sleep или дождитесь ввода, как показано в других ответах.

Существует C++11 способ сделать это. Это довольно просто, и я считаю, что это портативный. Конечно, как указывали гонки на легкости на орбите, вы не должны делать это, чтобы видеть Hello World в своем терминале, но есть веская причина использовать функцию ожидания. Без дальнейших церемоний,

#include <chrono> // std::chrono::microseconds
#include <thread> // std::this_thread::sleep_for;
std::this_thread::sleep_for(std::chrono::microseconds{});

Более подробная информация доступна здесь. Смотрите также sleep_until.

Эквивалент пакетной программы будет

#include<iostream>
int main()
{
    std::cout<<"Hello, World!\n";
    std::cin.get();
    return 0;
}

Дополнительная строка делает именно то, что PAUSE делает, ждет ввода одного символа

На самом деле, вопреки другим ответам, я считаю, что решение OP является наиболее элегантным.

Вот что вы получаете, используя внешний .bat обертка:

  1. Приложение явно ожидает ввода данных пользователем, поэтому оно уже делает то, что вы хотите.
  2. Вы не загромождаете код неудобными звонками. Кто должен ждать? main()?
  3. Вам не нужно заниматься кросс-платформенными проблемами - посмотрите, сколько людей предложили system("pause") Вот.
  4. Без этого для автоматического тестирования вашего исполняемого файла в модели тестирования черного ящика вам необходимо смоделировать enter нажатие клавиши (если вы не делаете вещи, упомянутые в сноске).
  5. Возможно, самое главное - должен ли любой пользователь запускать ваше приложение через терминал (cmd.exe на платформе Windows), они не хотят ждать, так как они все равно увидят вывод. С .bat техника обертки, они могут решить, следует ли запустить .bat (или же .sh), или запустите исполняемый файл напрямую.

Сосредоточив внимание на последних двух пунктах - с любой другой техникой я бы ожидал, что программа предложит по крайней мере --no-wait переключиться так, чтобы я, как пользователь, мог использовать приложение со всеми видами операций, такими как конвейеризация вывода, связывание его с другими программами и т. д. Это часть обычного рабочего процесса CLI и добавление ожидания в конце, когда вы уже внутри терминала просто мешает и разрушает пользовательский опыт.

По этим причинам ИМО .bat Решение самое хорошее здесь.

То, что у вас есть, можно написать проще. Вместо:

#include<iostream>
int main()
{
    std::cout<<"Hello, World!\n";
    return 0;
}

записывать

#include<iostream>
int main()
{
    std::cout<<"Hello, World!\n";
    system("PAUSE");
    return 0;
}

Системная функция выполняет все, что вы ей даете, как если бы оно было записано в командной строке. Он приостанавливает выполнение вашей программы во время выполнения команды, поэтому вы можете делать с ней все, что угодно, даже компилировать программы из вашей программы cpp.

Синтаксис:

бессонный сон (секунды без знака);

sleep () приостанавливает выполнение на интервал (секунды). При вызове режима ожидания текущая программа приостанавливается на выполнение на количество секунд, указанное в аргументе секунд. Интервал является точным только с точностью до одной сотой секунды или с точностью часов операционной системы, в зависимости от того, что меньше.

Этот пример должен прояснить:

#include <dos.h>
#include <stdio.h>
#include <conio.h>

int main()
{
   printf("Message 1\n");
   sleep(2); //Parameter in sleep is in seconds
   printf("Message 2 a two seconds after Message 1");
   return 0;
}

Помните, что вы должны #include dos.h

РЕДАКТИРОВАТЬ:

Вы также можете использовать WinAPI.

VOID WINAPI Sleep(
DWORD dwMilliseconds
);

Функция сна (Windows)

Просто обратите внимание, что параметр в функции, предоставляемой winapi, указывается в миллисекундах, поэтому строка сна в приведенном выше фрагменте кода будет выглядеть так: "Sleep(2000);"

getchar() предоставляет упрощенный ответ (ожидает ввода с клавиатуры). Вызвать Sleep(миллисекунды), чтобы уснуть перед выходом. Функция сна (MSDN)

Вы можете использовать sleep() или usleep().

// Wait 5 seconds
sleep( 5 );

Ну, это старый пост, но я просто внесу свой вклад в вопрос - кто-то может найти его полезным позже:

добавив 'cin.get();' Функция как раз перед возвратом main(), кажется, всегда останавливает выход из программы перед выводом результатов: см. пример кода ниже:

int main() {строка fname, lname;

  //ask user to enter name first and last name
  cout << "Please enter your first name: ";
  cin >> fname;

  cout << "Please enter your last name: ";
  cin >> lname;     
  cout << "\n\n\n\nyour first name is: " << fname << "\nyour last name is: " 
  << lname <<endl;

  //stop program from exiting before printing results on the screen
  cin.get();
  return 0;

}

Перед оператором возврата в главном введите этот код:

Система ("пауза");

Это будет держать консоль, пока вы не нажмете клавишу.

#include<iostream>
#include<string>

using namespace std;

int main()
{
    string s;
    cout << "Please enter your first name followed by a newline\n";
    cin >> s;
    cout << "Hello, " << s << '\n';
    system("pause");
    return 0; // this return statement isn't necessary
}

Второе, чему стоит научиться (можно утверждать, что это должно быть первым), - это интерфейс командной строки вашей ОС, флаги и переключатели компилятора / компоновщика.

Другие вопросы по тегам