web-dev-qa-db-ja.com

C ++にまともな待機機能はありますか?

C++で最初に学んだことの1つは、

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

一時停止することなく、非常にすばやく表示および非表示になります。これを防ぐには、メモ帳に移動して保存する必要がありました

helloworld.exe
pause

ase

helloworld.bat

多数の小さなテストプログラムを作成する必要がある場合、これは退屈になり、最終的には、結果を確認できるように、ほとんどのテストプログラムの最後にwhile(true);を追加しました。使用できるより良い待機機能はありますか?

46
user98188

プログラムを閉じる前にEnterキーを押すようユーザーに要求することができます。

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

Cinはユーザー入力を読み取り、cinの.ignore()関数は入力を無視するようにプログラムに指示します。ユーザーがEnterキーを押すと、プログラムが続行されます。

リンク

63
DeadHead

多くの人々がPOSIX sleep、Windows Sleep、Windows system("pause")、C++ cin.get()を提案しています。だいたい1920年代後半からDOS getch()もあります。 。

Pleaseこれらのいずれも実行しないでください。

これらのソリューションはいずれも、私のチームではコードレビューに合格しません。つまり、製品に含めるためにこのコードを送信した場合、コミットはブロックされ、別の解決策を見つけるように指示されます。 (単に趣味で遊んでいるときはそれほど深刻ではないと主張するかもしれませんが、あなたのペットプロジェクトで良い習慣を身に付けることは、あなたをビジネス組織の大切な専門家にし、あなたを雇い続けることになると提案します。 )

コンソールウィンドウを開いたままにして、プログラムの出力を読み取れるようにするのは、プログラムの責任ですnot!プログラムの最後に待機/スリープ/ブロックを追加すると、単一の責任原則に違反し、大規模な抽象化リークが発生し、プログラムの再利用性/チェーン可能性がなくなります。入力を受け取って出力することはなくなり、一時的な使用上の理由でブロックします。これは非常に良くありません。

代わりに、environmentを設定して、プログラムの作業が終了した後もプロンプトを開いたままにしてください。 バッチスクリプトラッパーは優れたアプローチです!手動で更新し続ける必要があるのは面倒で、IDEから呼び出すことはできません。 スクリプトがパラメータとして実行するプログラムへのパスを取得し、プログラムの代わりにそれを呼び出すようにIDEを設定することができます。

暫定的なクイックスタートアプローチは、IDEの実行コマンドを変更するcmd.exe <myprogram>または<myprogram>からcmd.exe /K <myprogram>に変更することです。 /Kcmd.exeに切り替えます指定されたパスのプログラムが終了した後、プロンプトを開いたままにします。これは、バッチスクリプトソリューションよりも少し面倒です。なぜなら、スペースバーを叩くのではなく、プログラムの出力を読み終えたら、exitを入力するか、赤い「X」をクリックする必要があるからです。 。


IDEの使用を想定しています。それ以外の場合は、コマンドプロンプトから既に呼び出しているため、そもそもこれは問題になりません。さらに、(質問で与えられた詳細に基づいて)Windowsの使用を想定していますが、この答えはすべてのプラットフォームに当てはまります...偶然、ポイントの半分です。

上記のコードは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);

スリープを使用してエラーメッセージまたは問題が発生する場合は、特にCode :: Bloksで_sleepまたはSleepに置き換えてみてください。
それでも問題が解決しない場合は、コードの先頭にこのライブラリを1つ追加してみてください。

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

  • system( "PAUSE")

Windowsコンソールアプリケーションの単純な「Hello world」プログラムは、おそらく何かを見る前に終了するでしょう。 system( "Pause")を使用できる場合。

#include <iostream>    

using namespace std;   

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

    system("PAUSE");

    return 0;
}

「エラー:このスコープで 'system'が宣言されていません」というメッセージが表示された場合は、コードのbigginingに次の行を追加してください。

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

  • getch()

ライブラリ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()を使用するよう指示するメッセージを表示できます

44
borderless

テキストを表示するウィンドウの表示と非表示は、プログラムの実行方法の機能であり、C++の機能ではありません。

永続的なコマンドライン環境で実行するか、ウィンドウのサポートを含めるinプログラムを使用するか、sleepを使用するか、他の回答に示すように入力を待機します。

20
dmckee

バッチプログラムと同等のものは

#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. おそらく最も重要なのは、ユーザーがターミナル(Windowsプラットフォームではcmd.exe)を介してアプリケーションを実行する必要がある場合、do n'tとにかく出力が表示されるためです。 .batラッパーテクニックを使用すると、.bat(または.sh)ラッパーを実行するか、実行可能ファイルを直接実行するかを決定できます。

最後の2点に焦点を当てる-他の手法では、プログラムが少なくとも--no-waitスイッチを提供し、ユーザーとして、出力のパイピングなどのあらゆる種類の操作でアプリケーションを使用できるようになると思います、他のプログラムなどと連鎖します。これらは通常のCLIワークフローの一部であり、既に端末内にいるときに最後に待機を追加すると、邪魔になり、ユーザーエクスペリエンスが破壊されます。

これらの理由から、ここではIMO .batソリューションが最適です。

7
rr-

それを行うC++ 11の方法があります。それは非常に単純であり、ポータブルであると信じています。もちろん、 OrbitのLightness Races が指摘しているように、Hello Worldを使用しますが、待機機能を使用する正当な理由がいくつかあります。難しい話は抜きにして、

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

詳細はこちら こちら をご覧ください。 sleep_until も参照してください。

6
Kevin

持っているものを簡単に書くことができます。の代わりに:

#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プログラムからプログラムをコンパイルすることもできます。

4
poliklosio

構文:

void sleep(unsigned seconds);

sleep()は、間隔(秒)の間実行を一時停止します。 sleepを呼び出すと、引数secondsで指定された秒数の間、現在のプログラムの実行が中断されます。間隔は、最も近い100分の1秒またはオペレーティングシステムクロックの精度のいずれか低い方の精度のみです。

この例はそれを明確にするはずです:

#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);」のようになります。

2
Ivan Prodanov