web-dev-qa-db-ja.com

C ++-コンソールウィンドウを開いたままにしますか?

私の質問は非常に簡単ですが、C#からC++に移行しています。C++でコンソールウィンドウが開いているのはどのコマンドなのでしょうか。

私はC#で知っています、最も基本的な方法は次のとおりです:

Console.ReadLine();

または、ユーザーに任意のキーを押しさせたい場合は、次のようにします。

Console.ReadKey(true);

C++でこれをどのように行いますか?ここでこの単純な質問をする唯一の理由は、インターネット上で適切で明確な答えを見つけることができなかったからです。

37
Alex

std::cin.get();はどうですか?

また、Visual Studioを使用している場合は、デバッグせずに実行でき(デフォルトではCTRL-F5)、最後にコンソールを閉じません。デバッグを使用して実行する場合、main()の右中括弧にブレークポイントを常に置くことができます。

64
Cogwheel

正しい方法

_cin.get();
_

cin.get()はC++に準拠しており、移植可能です。標準入力(stdin)から次の文字を取得します。ユーザーがEnterキーを押すと、プログラムは引き続き実行され、この場合は終了します。

Microsoftの見解

Microsoftには、 コンソールウィンドウの消失防止 というタイトルのナレッジベース記事があります。必要な場合にのみ、つまり、ユーザーがエクスプローラーからプログラムを実行して新しいコンソールウィンドウを生成した場合にのみ、実行を一時停止する方法について説明します。コードはCにあり、ここで再現しました。

_#include <windows.h>
#include <stdio.h>
#include <conio.h>

CONSOLE_SCREEN_BUFFER_INFO csbi;
HANDLE hStdOutput;
BOOL bUsePause;

void main(void)
{
        hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
        if (!GetConsoleScreenBufferInfo(hStdOutput, &csbi))
        {
                printf("GetConsoleScreenBufferInfo failed: %d\n", GetLastError());
                return;
        }

        // if cursor position is (0,0) then use pause
        bUsePause = ((!csbi.dwCursorPosition.X) &&
                     (!csbi.dwCursorPosition.Y));

        printf("Interesting information to read.\n");
        printf("More interesting information to read.\n");

        // only pause if running in separate console window.
        if (bUsePause)
        {
                int ch;
                printf("\n\tPress any key to exit...\n");
                ch = getch();
        }
}
_

私はこれを自分で使用しましたが、それはもちろん、窓の下でそれを行うには良い方法です。また、次のコマンドを使用してプログラムを起動すると、Windowsで非プログラム的にこれを実現できます。

_cmd /K consoleapp.exe
_

間違った方法

これを達成するために次のいずれも使用しないでください。

_system("PAUSE");
_

これにより、プログラム内に新しいcmd.exe/command.comプロセスが生成され、Windowsコマンド「一時停止」が実行されます。 pauseコマンドはウィンドウ固有であるため、これは完全に不要であり、移植性もありません。残念ながら、私はこれをよく見ました。

_getch();
_

これは、C/C++標準ライブラリの一部ではありません。これは単なるコンパイラ拡張機能であり、一部のコンパイラではサポートされません。

23
Mike Weller

問題がアプリケーション(c-code)を変更せずにVisual Studio内にコンソールウィンドウを保持し、Ctrl + F5(Ctrl + F5を実行中)で実行しているが、ウィンドウがまだ閉じている場合は、/ SUBSYSTEMを設定します:Visual Studioプロジェクトの:CONSOLEリンカーオプション。

http://social.msdn.Microsoft.com/Forums/en-US/vcprerelease/thread/21073093-516c-49d2-81c7-d960f6dc2ac6 でDJMooreTXによって説明されているように

1)プロジェクトを開き、ソリューションエクスプローラーに移動します。 K&Rで私と一緒にフォローしている場合、「ソリューション」は「hello」となり、その下に1つのプロジェクトがあり、「hello」も太字で表示されます。

  1. 「hello」(またはプロジェクト名)を右クリックします。

  2. コンテキストメニューから[プロパティ]を選択します。

  3. [構成プロパティ]> [リンカー]> [システム]を選択します。

  4. 右側のペインの「サブシステム」プロパティについては、右側の列のドロップダウンボックスをクリックします。

  5. 「コンソール(/ SUBSYSTEM:CONSOLE)」を選択します

  6. [適用]をクリックし、それが行うことをすべて完了するまで待ってから、[OK]をクリックします。 ([適用]がグレー表示されている場合は、他のサブシステムオプションを選択して[適用]をクリックし、戻ってコンソールオプションを適用します。私の経験では、それ自体は機能しません。)

今すぐBorisのCTRL-F5を実行し、プログラムがコンパイルおよびリンクされるのを待ち、デスクトップ上の他のすべてのジャンクの下のコンソールウィンドウを見つけ、プログラムの出力を読んでから、「押して続行してください...」 「プロンプト。

繰り返しますが、CTRL-F5とサブシステムのヒントは連携して機能します。それらは別個のオプションではありません。

8
jfseb

より適切な方法は、std::cin.ignoreを使用することです。

#include <iostream>

void Pause()
{
   std::cout << "Press Enter to continue...";
   std::cout.flush();
   std::cin.ignore(10000, '\n');
   return;
}
4
Thomas Matthews

また、IDE少し。 「続行するには任意のキーを押してください...」というメッセージで終了します。

もちろん、「Hit any key」を使用してプログラムを実行し続ける(つまり、スレッドをキープする)場合、これは機能しません。また、「デバッグ付き」で実行すると機能しません。ただし、ブレークポイントを使用してウィンドウを開いたままにすることができます。

2
Daver

Windowsでは、_getch()を使用できます。

<conio.h>

ヘッダ。

1
DanDan

トーマスが言うように、cin ignoreは良い方法です。 (exitが使用されている場合でも)ユーザーがEnterキーを押すのを常に待機するには、関数atexitを登録します。

#include <iostream>

void pause()
{   ::std::cout<<"\nPress ENTER to exit.";
    ::std::cin.sync();
    if(::std::cin.get()!='\n')
        ::std::cin.ignore(0xFFFFFFFF,'\n');
}

int main()
{
    atexit(pause);

    // whatever

    return 0;
}
1
S. Paris

私はmingw32-gcc-4.6.2コンパイラを使用している環境でstd::getwchar()を使用しています。サンプルコードを次に示します。

#include <iostream>
#include "Arithmetics.h"

using namespace std;

int main() {
    ARITHMETICS_H::testPriorities();

    cout << "Press any key to exit." << endl;
    getwchar();
    return 0;
}
1
isu3ru

コンソールアプリケーションを作成すると、コンソールはアプリケーションを閉じるまで開いたままになります。

すでにアプリケーションを作成していて、コンソールを開く方法がわからない場合、プロジェクト構成->リンカー->システムでサブシステムをConsole(/ Subsystem:Console)として変更できます。

0
ufukgun

C#で行ったこととほぼ同じ種類のこと。 getch()の呼び出しがおそらく最も簡単です。

0
Jerry Coffin