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

ma question est très simple, mais je suis en train de passer de C# à C++, et je me demandais quelle commande maintenait la fenêtre de la console ouverte en C++?

je sais en C#, de la façon la plus simple est:

Console.ReadLine();

Ou si vous souhaitez que l'utilisateur d'appuyer sur une touche, sa:

Console.ReadKey(true);

Comment faire en C++? La seule raison pour laquelle je pose cette simple question ici, c'est que je n'ai pas été en mesure de trouver une bonne réponse claire sur internet.

35
demandé sur Abel 2009-12-15 19:10:49

11 réponses

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

aussi, si vous utilisez Visual Studio, vous pouvez exécuter sans débogage (CTRL-F5 par défaut) et il ne fermera pas la console à la fin. Si vous l'exécutez avec le débogage, vous pouvez toujours mettre un point d'arrêt à l'accolade de fermeture main().

53
répondu Cogwheel 2009-12-15 16:22:41

Le droit chemin

cin.get();

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

Microsoft prend

Microsoft a un article de base de connaissances intitulé empêcher la fenêtre de la Console de disparaître. Il décrit comment mettre en pause l'exécution que si nécessaire, c'est-à-dire seulement lorsque l'Utilisateur a généré 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 les fenêtres seulement bien sûr. Notez aussi que vous pouvez réaliser cela sans programme sous windows en lançant votre programme avec cette commande:

cmd /K consoleapp.exe

mauvais

n'utilisez aucun des éléments suivants pour réaliser ceci:

system("PAUSE");

ceci exécutera la commande 'pause' de windows en créant un nouveau cmd.exe / command.processus com au sein de votre programme. Ceci est à la fois complètement inutile et non portable puisque la commande pause est spécifique à windows. Malheureusement, j'ai vu beaucoup.

getch();

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

20
répondu Mike Weller 2009-12-15 18:00:17

si votre problème est de maintenir la fenêtre de la Console dans Visual Studio sans modifier votre application (code c) et l'exécutent avec Ctrl+F5 (lors de L'exécution Ctrl+F5) mais la fenêtre se ferme toujours le principal conseil est de définir l'option / SUBSYSTEM:CONSOLE linker dans votre projet Visual Studio.

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

1) Ouvrez votre projet, et allez dans l'Explorateur de solutions. Si vous suivez avec moi dans K & R, votre "Solution" sera 'hello' avec 1 projet en dessous, aussi 'hello' en gras.

  1. clic droit sur le 'hello' (ou quel que soit le nom de votre projet.)

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

  3. Choisir Les Propriétés De Configuration>Linker > System.

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

  5. Choose " Console (/SUBSYSTEM:CONSOLE)"

  6. cliquez sur Appliquer, attendez qu'il termine ce qu'il fait, puis cliquez sur OK. (Si "Apply" est grisé, choisissez une autre option du sous-système, cliquez sur Apply, puis retournez en arrière et appliquez l'option console. Mon expérience est que OK par lui-même ne fonctionne pas.)

maintenant, Faites Le Ctrl-F5 de Boris, attendez que votre programme compilez et liez, trouvez la fenêtre de la console sous toutes les autres Junkies sur votre bureau, et lisez la sortie de votre programme, suivi par le bien-aimé "appuyez sur n'importe quelle touche pour continuer...." invite.

encore une fois, CTRL-F5 et les indices du sous-système fonctionnent ensemble; ce ne sont pas des options séparées.

8
répondu jfseb 2012-01-03 18:39:57

une méthode plus appropriée est d'utiliser std::cin.ignore:

#include <iostream>

void Pause()
{
   std::cout << "Press Enter to continue...";
   std::cout.flush();
   std::cin.ignore(10000, '\n');
   return;
}
4
répondu Thomas Matthews 2009-12-15 17:48:36

vous pouvez aussi vous appuyer un peu sur L'IDE. Si vous exécutez le programme en utilisant la commande "Démarrer sans débogage" (Ctrl+F5 pour moi), la fenêtre de la console restera ouverte même après que le programme se termine avec un "appuyez sur n'importe quelle touche pour continuer . . ." message.

bien sûr, si vous voulez utiliser la touche "Hit any key" pour maintenir votre programme en marche (i.e. garder un thread vivant), cela ne marchera pas. Et cela ne fonctionne pas quand vous exécutez "avec le débogage". Mais alors vous pouvez utiliser les points de rupture pour tenir la fenêtre ouvrir.

2
répondu Daver 2009-12-15 16:23:24

Dans windows, vous pouvez utiliser _getch() dans le

<conio.h>

en-tête.

1
répondu DanDan 2009-12-15 16:19:47

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

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

0
répondu ufukgun 2009-12-15 16:16:26

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

0
répondu Jerry Coffin 2009-12-15 16:16:59

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
répondu isu3ru 2014-02-07 12:04:44

comme le dit Thomas, 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
répondu S. Paris 2014-02-07 14:08:51

hey, tout d'abord pour inclure les fonctions c++, vous devez utiliser

include<iostream.h> au lieu de stdio .h

and to hold the output screen there is a simple command getch();
here, is an example:
   #include<iostream.h>
   #include<conio.h>
   void main()  \or int main(); if you want
  {
    cout<<"c# is more advanced than c++";
    getch();
  }

merci

-2
répondu ankur ranjan 2012-03-10 07:31:15