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.
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()
.
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.
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.
clic droit sur le 'hello' (ou quel que soit le nom de votre projet.)
Choisissez "Propriétés" dans le menu contextuel.
Choisir Les Propriétés De Configuration>Linker > System.
pour la propriété "sous-système" volet de droite, cliquez sur la liste déroulante dans la colonne de droite.
Choose " Console (/SUBSYSTEM:CONSOLE)"
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.
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;
}
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.
Dans windows, vous pouvez utiliser _getch()
dans le
<conio.h>
en-tête.
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.
à peu près le même genre de choses que vous avez faites en C#. Appel de getch()
est probablement le plus simple.
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;
}
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;
}
hey, tout d'abord pour inclure les fonctions c++, vous devez utiliser
include
<iostream.h>
au lieu de stdio .hand 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