web-dev-qa-db-fra.com

C++ - Maintenir la fenêtre de la console ouverte?

Ma question est très simple, mais je passe de C # à C++ et je me demandais quelle commande maintenait la fenêtre de la console ouverte en C++.

Je sais en C #, la manière la plus simple est:

Console.ReadLine();

Ou si vous voulez laisser l’utilisateur appuyer sur n’importe quelle touche:

Console.ReadKey(true);

Comment faites-vous cela en C++? La seule raison pour laquelle je pose une question aussi simple, c'est que je n'ai pas été en mesure de trouver une réponse claire et efficace sur Internet.

35
Alex

Que diriez-vous de std::cin.get();?

De même, si vous utilisez Visual Studio, vous pouvez exécuter sans débogage (CTRL-F5 par défaut) et la console ne sera pas fermée à la fin. Si vous l'exécutez avec le débogage, vous pouvez toujours placer un point d'arrêt à l'accolade fermante de main().

56
Cogwheel

Le droit chemin

cin.get();

cin.get() est conforme à C++ et portable. Il va récupérer le caractère suivant de l'entrée standard (stdin). L'utilisateur peut appuyer sur enter et votre programme continuera alors de s'exécuter ou se terminera dans notre cas.

Microsoft prend

Microsoft propose un article de la base de connaissances intitulé Empêcher la fenêtre de console de disparaître . Il explique comment suspendre l’exécution uniquement lorsque cela est nécessaire, c’est-à-dire uniquement lorsque l’utilisateur a créé une nouvelle fenêtre de console en exécutant le programme à partir de l’explorateur. Le code est en C que j'ai reproduit ici: 

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

Je l'ai utilisé moi-même et c'est une bonne façon de le faire, sous Windows uniquement. Notez également que vous pouvez réaliser ceci de manière non programmée sous Windows en lançant votre programme avec cette commande:

cmd /K consoleapp.exe

La mauvaise direction

N'utilisez aucun des éléments suivants pour y parvenir:

system("PAUSE");

Ceci exécutera la commande Windows "pause" en créant un nouveau processus cmd.exe/command.com dans votre programme. Ceci est à la fois totalement inutile et non portable car la commande pause est spécifique à Windows. Malheureusement, j'ai souvent vu cela.

getch();

Cela ne fait pas partie de la bibliothèque standard C/C++. C'est juste une extension de compilateur et certains compilateurs ne le supporteront pas. 

21
Mike Weller

Si votre problème consiste à conserver la fenêtre de console dans Visual Studio sans Modifier votre application (c-code) Et l'exécuter avec Ctrl + F5 (lors de l'exécution de Ctrl + F5) mais que la fenêtre est toujours en cours de fermeture l'indicateur principal consiste à définir l'option/SUBSYSTEM: CONSOLE linker dans votre projet Visual Studio. 

comme expliqué par DJMooreTX dans http://social.msdn.Microsoft.com/Forums/en-US/vcprerelease/thread/21073093-516c-49d2-81c7-d960f6dc2ac6

1) Ouvrez votre projet et accédez à l'explorateur de solutions. Si vous me suivez dans K & R, votre "solution" sera "bonjour" avec 1 projet en dessous, ainsi que "bonjour" en gras.

  1. Faites un clic droit sur le "bonjour" (ou quel que soit le nom de votre projet.)

  2. Choisissez "Propriétés" dans le menu contextuel.

  3. Choisissez Propriétés de configuration> Éditeur de liens> Système.

  4. Pour la propriété "Sous-système" dans le volet de droite, cliquez sur la liste déroulante dans la colonne de droite.

  5. Choisissez "Console (/ SOUS-SYSTEME: CONSOLE)"

  6. Cliquez sur Appliquer, attendez que l'opération soit terminée, puis cliquez sur OK. (Si "Appliquer" est grisé, choisissez une autre option de sous-système, cliquez sur Appliquer, puis revenez en arrière et appliquez l'option de la console. Mon expérience est que OK ne fonctionnera pas par lui-même.)

Maintenant, lancez CTRL-F5 de Boris, attendez que votre programme soit compilé et lié, recherchez la fenêtre de la console sous tous les autres fichiers indésirables de votre bureau et lisez le résultat de votre programme, suivi de la bien-aimée "Appuyez sur n’importe quelle touche pour continuer .... "Invite.

De nouveau, CTRL-F5 et les indicateurs de sous-système fonctionnent ensemble; ce ne sont pas des options séparées.

8
jfseb

Une méthode plus appropriée consiste à utiliser 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

Vous pouvez également vous appuyer un peu sur le IDE. Si vous exécutez le programme à l'aide de la commande "Démarrer sans déboguer" (Ctrl + F5 pour moi), la fenêtre de la console restera ouverte même après la fin du programme avec "Appuyez sur n'importe quelle touche pour continuer..." message. 

Bien sûr, si vous voulez utiliser la touche "Appuyez sur n’importe quelle touche" pour que votre programme continue de fonctionner (c’est-à-dire garder un fil actif), cela ne fonctionnera pas. Et cela ne fonctionne pas lorsque vous exécutez "avec le débogage". Mais vous pouvez ensuite utiliser des points d'arrêt pour maintenir la fenêtre ouverte.

2
Daver

Dans Windows, vous pouvez utiliser _getch() dans le 

<conio.h>

entête.

1
DanDan

si vous créez une application console, la console restera ouverte jusqu'à la fermeture de l'application.

si vous avez déjà créé une application et que vous ne savez pas comment ouvrir une console, vous pouvez modifier le sous-système en tant que Console (/ Subsystem: Console) dans les configurations de projet -> éditeur de liens -> système.

0
ufukgun

À peu près le même genre de choses que vous avez faites en C #. Appeler getch() est probablement le plus simple.

0
Jerry Coffin

Comme Thomas dit, le cin ignore est un bon moyen ..__ Pour toujours attendre que l'utilisateur appuie sur entrée (même si exit est utilisé), enregistrez une fonction 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;
}
0
S. Paris

J'utilise std::getwchar() dans mon environnement qui est avec le compilateur mingw32 - gcc-4.6.2, voici un exemple de code.

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

using namespace std;

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

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