Есть ли достойная функция ожидания в С++?

Одна из первых вещей, которые я изучил на С++, заключалась в том, что

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

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

helloworld.exe
pause

аза

helloworld.bat

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

Ответ 1

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

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

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

Ссылка

Ответ 2

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

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

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

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

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

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


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

Ответ 3

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

Чтобы заставить вашу программу останавливаться или ждать, у вас есть несколько вариантов:


  • sleep (unsigned 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() insted getch

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

Здесь вы получаете, используя внешнюю оболочку .bat:

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

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

По этим причинам наиболее приемлемым является решение IMO .bat.

Ответ 7

Есть способ сделать это на С++ 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.

Ответ 8

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

#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.

Ответ 9

Синтаксис:

void sleep (беззнаковые секунды);

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

EDIT:

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

VOID WINAPI Sleep(
DWORD dwMilliseconds
);

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

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

Ответ 10

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

Ответ 11

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

// Wait 5 seconds
sleep( 5 );

Ответ 12

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

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

int main() {     string 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;

}

Ответ 13

Перед операцией return в главном вставьте этот код:

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

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

#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
}

Ответ 14

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