2009-07-23 7 views
15

Après la compilation des programmes de la console, la fenêtre de la console se ferme immédiatement après l'exécution. Quelle est la meilleure pratique pour le garder ouvert? J'ai cherché google load, je suis habitué aux blocs de code où vous n'avez pas à vous en soucier, mais je veux un peu tourner avec Visual Studio et avec VS, ma console se ferme. Dans l'interwebz il y a plusieurs façons de le garder ouvert, cependant, j'ai lu que la plupart d'entre elles sont de mauvaises techniques de codage. Quelle est la méthode préférée de tout le monde?Quelle est la meilleure pratique pour lutter contre le problème de fermeture de la console?

Répondre

5

cin est grossièrement inélégante mais facile pour les distraits à dériver:

{ 
    char c; 
    std::cin >> c; 
} 

qui maintient la fenêtre ouverte jusqu'à ce que vous tapez un caractère/* modifier */et appuyez sur Entrée.

std::cin.get()std::cin.get() fermera la fenêtre au moment où vous tapez un caractère, ce qui, en fonction de la façon dont vous vous habituez facilement, court un risque légèrement plus grand de "whoops, j'aurais aimé ne pas l'avoir fermé!" que les deux touches operator>>(istream &).

Les deux diffèrent d'un system("pause") en ce qu'ils retournent d'une manière accessible au programme la valeur du caractère que vous avez tapé, donc, si cela arrive souvent, un kludge conduit à un autre, vous pouvez écrire une déclaration de commutateur sur la base de vous avez tapé pour (par exemple) quitter immédiatement, écrire des valeurs dans un journal, l'exécuter à nouveau, etc.

+3

std :: cin.get() a le même effet et est plus court –

+3

Il maintient la fenêtre jusqu'à ce qu'il puisse obtenir un caractère. Ce qui n'est pas jusqu'à ce que le tampon soit vidé (cin est tamponné). Il faut donc que l'utilisateur appuie sur Entrée (ou tape beaucoup de caractères et remplisse le tampon). –

+0

@ robson3.1415, @martin voir edit :-) –

2

Il est très courant de mettre du code pour lire une clé depuis la console après la fermeture du code de votre application principale. . La touche que vous avez lue est simplement jetée, mais elle maintient la console ouverte.

Ce n'est pas assez, nécessairement - mais je fais souvent ce enveloppé dans un débogage définir, donc pendant le débogage, la console est maintenue ouverte. Au cours de la publication, je ne cours généralement pas à l'intérieur de VS, et lorsqu'il est exécuté à partir d'une ligne de commande, ce n'est plus un problème.

+0

J'aime l'idée de debug #define. certainement mieux qu'un point d'arrêt. – AShelly

13

Puisque vous exécutez toujours dans le débogueur, définissez un point d'arrêt sur la déclaration de retour de main(). Le débogueur est votre meilleur ami, apprenez (et apprenez tôt) à l'utiliser à votre avantage à chaque occasion.

+1

chaque fois que je fais cela, je me retrouve constamment dans le crt0.c, ce qui est vraiment ennuyeux. – AShelly

6

Lancez votre programme dans une console, ce qui serait le moyen attendu de l'exécution d'un programme de console ...

Vous pouvez faire un petit fichier batch pour exécuter votre programme qui aurait:

REM batch file to launch program 
yourprogram.exe 
PAUSE 

et la commande PAUSE cmd.exe demandera à l'utilisateur d'appuyer sur n'importe quelle touche.

+9

C'est assez facile en fait. Faites un clic droit sur votre projet dans VS, choisissez Propriétés. Sous la section de débogage, vous pouvez lui indiquer de démarrer un programme externe. Dans ce cas, ce serait le fichier batch qui lancerait votre application. –

4

J'ai tendance à utiliser system("PAUSE"); qui vous donne un

Press any key to continue . . .

un message

.

+1

Je pense que c'est spécifique à Windows, mais le travail est fait. – DeusAduro

+0

Vous avez raison, c'est Windows uniquement, mais je n'ai jamais trouvé que cela soit un problème dans Visual Studio donc pensé que ce serait OK .. – irh

+2

-1 Ne pas utiliser les appels système pour des choses comme ça – Patrick

0

Appelez cette fonction avant de retourner à la fin de la principale:

void onEnd() 
{ 
    printf("Press any key to exit..."); 
    _getch(); 
} 
21

Lorsque j'utilise Visual Studio et je ne ai pas besoin de débogage je viens de lancer à l'aide Ctrl +F5 combinaison de touches – et empêche la fermeture de la console.

3

J'utilise:

cin.get() 

je l'ai entendu était moins coûteux que le système ("PAUSE") et il fonctionne sur les systèmes POSIX aussi. Il y a un bon link qui va dans le détail à ce sujet.

+4

Qu'est-ce qui est coûteux à faire avec quoi que ce soit? Le point entier du code est de garder la fenêtre du terminal qui traîne jusqu'à ce que vous appuyez sur une touche. À quel point pensez-vous que 'system (" PAUSE ")' est lent, comparé à e. vos réflexes ;-) –

3

Résistez à la tentation de faire n'importe quoi. Les programmes de ligne de commande bien exécutés se terminent lorsqu'ils ont terminé de signaler un statut via leur code de sortie. Cela leur permet d'être scriptables et «bons citoyens» dans des environnements automatisés. Même dans un environnement interactif, pourquoi forcer l'utilisateur à faire une touche supplémentaire juste à cause de votre environnement de débogage? Si vous exécutez plutôt que de déboguer, Visual Studio ouvre une fenêtre de console qui s'arrête après la fermeture de l'application, ce qui vous permet d'afficher la sortie. Je ne sais pas pourquoi le comportement est différent lorsque vous déboguez, peut-être parce que vous avez des points d'arrêt disponibles. Si vous voulez voir la sortie à différentes étapes, vous pouvez placer des points d'arrêt après les instructions de sortie correspondantes ou à la fin de main options 'stop sur exception throw'.

Quelle que soit la raison, je ne me suis jamais senti obligé de compromettre le comportement de mon application juste pour améliorer mon expérience de débogage.

+0

+ 1 pour la différence de comportement de run vs. debug. –

1

Les réponses «ne faites pas ça» dans ce fil peuvent sembler brutes, mais elles sont assez raisonnables. Je suis tombé sur cette question parce que je débogue une suite gtest qui fonctionnait bien, mais qui se plante maintenant mystérieusement lorsqu'elle est lancée. Lorsqu'il est exécuté à partir de la console, il affiche une boîte de dialogue indiquant que "blah.exe a cessé de fonctionner"; mais, lorsqu'elle est exécutée à partir du débogueur, la console s'ouvre momentanément, disparaît et le programme se termine avec le statut 0. J'aurais dû réfléchir à la bizarrerie de cette différence de comportement, mais à la place j'étais comme: "Oh, mec, je dois faire en sorte que la fenêtre de la console reste allumée pour que je puisse voir ce qu'elle dit." Droite?

Il s'avère que la machine sur laquelle je travaille (un de mes collègues) avait les 'arguments de commande' pour le débogueur réglé sur '--gtest_filter = * testMsg *'. Je l'ai remarqué tout de suite, mais il ne m'est jamais venu à l'esprit que tous les tests correspondant au filtre avaient été renommés dans un commit récent. Ainsi, lorsqu'il a été lancé à partir du débogueur, gtest ne trouvait aucun test à exécuter et se terminait simplement. Encore 90 minutes de ma vie, je ne reviendrai jamais. (-_-) J'aurais pu abandonner ce bébé goudron beaucoup plus tôt si ma réaction instinctive n'avait pas été de penser que j'avais besoin de cette fenêtre de console pour rester ouverte afin de résoudre le problème ...

Questions connexes