web-dev-qa-db-fra.com

Comment garder la fenêtre de la console ouverte dans Visual C ++?

Je commence dans Visual C++ et j'aimerais savoir comment garder la fenêtre de la console.

Par exemple, il s’agit d’une application typique "hello world":

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Hello World";
    return 0;
}

Quelle est la ligne qui me manque?

180
Raúl Roa

Commencez le projet avec Ctrl+F5 au lieu de juste F5.

La fenêtre de la console reste maintenant ouverte avec le message Press any key to continue . . . après la fermeture du programme.

Notez que cela nécessite l’option Console (/SUBSYSTEM:CONSOLE) de l’éditeur de liens, que vous pouvez activer comme suit:

  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.
  2. Faites un clic droit sur le "bonjour" (ou quel que soit le nom de votre projet.)
  3. Choisissez "Propriétés" dans le menu contextuel.
  4. Choisissez Propriétés de configuration> Éditeur de liens> Système.
  5. Pour la propriété "Sous-système" dans le volet de droite, cliquez sur la liste déroulante dans la colonne de droite.
  6. Choisissez "Console (/ SOUS-SYSTEME: CONSOLE)"
  7. 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 en soi.)

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

(Gracieuseté de DJMorreTX de http://social.msdn.Microsoft.com/Forums/en-US/vcprerelease/thread/21073093-516c-49d2-81c7-d960f6dc2ac6 )

379
Zoidberg

La méthode standard est cin.get() avant votre déclaration de retour.

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Hello World";
    cin.get();
    return 0;
}
41
Gordon Wilson

Placez un point d'arrêt sur la ligne return.

Vous l'exécutez dans le débogueur, non?

24
Sam Harwell

Une autre option est d'utiliser

#include <process.h>
system("pause");

Bien que ce ne soit pas très portable, il ne fonctionnera que sous Windows, mais il sera automatiquement imprimé.

Appuyez sur n'importe quelle touche pour continuer...

17
Marcos Marin

Pour les projets Makefile, la solution acceptée échoue à cause d'un bogue dans Visual Studio (qui existe au moins jusqu'à la version 2012 - je n'ai pas encore testé 2013). Ce bug est détaillé ici .

Afin de mettre la console en pause après la fermeture du programme sur un projet de makefile, procédez comme suit (cela peut différer pour les versions autres que 2010 - 2012):

1) Passez /SUBSYSTEM:CONSOLE à l'éditeur de liens. - EDIT: voir ci-dessous.

2) Ouvrez votre fichier de projet (.vcxproj) dans un éditeur de texte.

3) Dans la balise racine <project>, insérez ce qui suit:

<ItemDefinitionGroup>
  <Link>
    <SubSystem>Console</SubSystem>
  </Link>
</ItemDefinitionGroup>

4) Rechargez le projet dans votre solution.

5) Exécutez le programme sans déboguer (CTRL + F5).

EDIT:

Comme indiqué dans mon commentaire ci-dessous, la définition de l'option de l'éditeur de liens /SUBSYSTEM:CONSOLE n'est pas pertinente pour les projets de makefile (et même pas nécessairement possible si vous utilisez un compilateur autre que MSVC). Tout ce qui compte est que le paramètre soit ajouté au fichier .vcxproj, comme indiqué à l'étape 3 ci-dessus.

7
JBentley

Vous pouvez utiliser cin.get(); ou cin.ignore(); juste avant votre instruction return pour éviter que la fenêtre de la console ne se ferme.

4
CMS

il suffit de placer un point d'arrêt sur le dernier crochet de la main.

    int main () {
       //...your code...
       return 0;
    } //<- breakpoint here

cela fonctionne pour moi, pas besoin d'exécuter sans débogage. Il exécute également les destructeurs avant d'atteindre le point d'arrêt afin que vous puissiez vérifier si des messages sont imprimés sur ces destructeurs, le cas échéant.

4
Juan Castano

Ajoutez simplement un point d'arrêt au crochet de fermeture de votre méthode _tmain. C'est le moyen le plus simple et vous n'avez pas à ajouter de code pour déboguer.

3
Odys

Mes 2 cents:

Choix 1: Ajouter un point d'arrêt à la fin de main()

Choix 2: Ajoutez ce code juste avant le _return 0;_:

_std::cout << "Press ENTER to continue..."; //So the User knows what to do
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
_

Vous devez inclure _<iomanip>_ pour std::numeric_limits

2
Arnav Borborah

il suffit d'ajouter le système ("pause") à la fin du code avant de renvoyer 0 comme ceci

#include <stdlib.h>

int main()
{
    //some code goes here
    system("pause")
    return 0;
}
2
user6041670

cin.get() ou system("PAUSE"). Je ne vous ai pas entendu dire que vous pouvez utiliser return(0);

2
Denchik

Placez un point d'arrêt sur l'accolade de fin de main(). Il sera déclenché même avec plusieurs instructions return. Le seul inconvénient est qu'un appel à exit() ne sera pas intercepté.

Si vous n'êtes pas en train de déboguer, suivez les conseils de la réponse de Zoidberg et lancez votre programme avec Ctrl+F5 au lieu de juste F5.

2
Chad

J'inclus #include <conio.h> et ensuite, j'ajoute getch(); juste avant la ligne return 0;. C'est ce que j'ai appris à l'école quand même. Les méthodes mentionnées ci-dessus sont très différentes, je vois.

1
Amruth Pillai

Avait le même problème. J'utilise _getch() juste avant l'instruction return. Ça marche.

1
Martin

Une autre option:

#ifdef _WIN32
#define MAINRET system("pause");return 0
#else
#define MAINRET return 0
#endif

En principal:

int main(int argc, char* argv[]) {
    MAINRET;
}
0
chen_767
int main()
{
    //...
    getchar();
    return 0;
}
0
gonnavis

Voici un moyen de garder la fenêtre de commande ouverte quelle que soit la façon dont l'exécution s'arrête sans modifier le code:

Dans Visual Studio, ouvrez Pages de propriétés du projet -> Débogage.

Pour Commande, entrez $(ComSpec)

Pour arguments de commande, entrez /k $(TargetPath). Ajoutez des arguments à votre propre application.

Maintenant F5 ou Ctrl-F5 exécute Windows/System32/cmd.exe dans une nouvelle fenêtre et / k garantit que l'invite de commande reste ouverte une fois l'exécution terminée.

L'inconvénient est que l'exécution ne s'arrête pas sur les points d'arrêt.

0
Jonathan Lidbeck

En réalité, la vraie solution est la sélection du modèle de projet lui-même. Vous DEVEZ sélectionner l’application console Win32 dans un ancien VS ou entrez d’abord le nom du projet, puis double-cliquez sur l’assistant de bureau Windows, puis sélectionnez l’application console Win32. Sélectionnez ensuite un projet vide à ce stade. Ceci permet alors à ce que le questionneur d'origine ait vraiment voulu sans ajouter de point d'arrêt supplémentaire et de code bloqué. J'ai traversé ce problème aussi. La réponse est également sur le site MSDN.

0
user9416431

J'ai eu le même problème; Dans mon application, il y a plusieurs points exit () et il n'y avait aucun moyen de savoir exactement où il se trouvait, alors j'ai découvert ceci:

atexit(system("pause"));

ou

atexit(cin.get());

De cette façon, ça s'arrêtera peu importe où nous sortons du programme.

0
Charaf Errachidi

(Certaines options peuvent être appelées sous différents noms. Je n'utilise pas la version anglaise)

J'ai eu le même problème lorsque j'ai créé des projets avec l'option "projet vide", créer un projet en tant qu '"application Win32-console" au lieu de "projet vide". Dans la boîte de dialogue qui s'affiche, cliquez sur "Continuer", puis cochez l'option "Projet vide" et appuyez sur Confirmer. Après cela, CTRL + F5 ouvrira une console qui ne se fermera pas automatiquement.

0
Blechdose