2009-07-23 13 views
15

Nach dem Kompilieren von Konsolenprogrammen wird das Konsolenfenster sofort nach dem Ausführen geschlossen. Was ist das beste Verfahren, um es offen zu halten? Ich habe Google Loads durchsucht, ich bin an Codeblocks gewöhnt, wo man sich nicht darum kümmern muss, aber ich möchte etwas mit Visual Studio herumspielen und mit VS schließt sich meine Konsole. Überall auf der Interwebz gibt es mehrere verschiedene Möglichkeiten, um es offen zu halten, jedoch habe ich gelesen, dass die meisten von ihnen schlechte Codierungstechniken sind. Was ist die bevorzugte Methode?Was ist die Best Practice für die Behebung des Problems mit der Console Closing?

Antwort

5

cin ist grob unelegant, aber einfach für den vergesslichen ableiten:

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

, dass das Fenster offen hält, bis Sie ein Zeichen/* edit * geben/und drücken Sie die Eingabetaste.

std::cin.get() schließt das Fenster in dem Moment, in dem Sie einen Charakter eingeben, der, je nachdem wie leicht Sie sich eingewöhnt, ein geringfügig größeres Risiko von "hoppla, ich wünschte, ich hätte das nicht geschlossen!" als der Zwei-Tastenanschlag operator>>(istream &). Die beiden unterscheiden sich von einer system("pause") darin, dass sie den Wert des von Ihnen eingegebenen Zeichens auf programmierbare Weise zurückgeben. Wenn also nicht selten ein Kludel zu einem anderen führt, können Sie basierend auf was eine switch-Anweisung schreiben Sie eingegeben, um (zum Beispiel) sofort zu beenden, schreiben Sie einige Werte in ein Protokoll, führen Sie es erneut usw.

+3

std :: cin.get() hat den gleichen Effekt und ist kürzer –

+3

Es hält das Fenster, bis es ein Zeichen bekommen kann. Was nicht bevor der Puffer geleert wird (cin ist gepuffert). Daher muss der Benutzer die Eingabetaste drücken (oder viele Zeichen eingeben und den Puffer füllen). –

+0

@ robson3.1415, @martin siehe bearbeiten :-) –

2

Eine sehr häufige ist, nur in Code einlesen, um einen Schlüssel aus der Konsole zu lesen, nachdem Ihr Hauptanwendungscode schließt . Der eingelesene Tastaturanschlag wird einfach weggeworfen, aber er hält die Konsole offen.

Es ist nicht schön, unbedingt - aber ich mache dies oft in eine Debug-Definition verpackt, so während des Debuggens wird die Konsole offen gehalten. Während der Veröffentlichung laufe ich normalerweise nicht in VS, und wenn es von einer Befehlszeile ausgeführt wird, ist das kein Problem mehr.

+0

Ich mag die debug # define Idee. definitiv besser als ein Breakpoint. – AShelly

13

Da Sie immer im Debugger ausgeführt werden, legen Sie einen Haltepunkt für die Rückgabeanweisung von main() fest.

Der Debugger ist dein bester Freund, lerne (und lerne früh), ihn bei jeder Gelegenheit zu deinem Vorteil zu nutzen.

+1

Wenn ich das mache, stoße ich ständig auf crt0.c, was wirklich nervig ist. – AShelly

6

Führen Sie Ihr Programm in einer Konsole, die die erwartete Art und Weise der Führung eines Konsolenprogramm ...

Alternativ wäre, können Sie eine kleine Batch-Datei Ihr Programm auszuführen, das haben würde:

REM batch file to launch program 
yourprogram.exe 
PAUSE 

und die PAUSE cmd.exe Befehl wird Benutzer aufgefordert, eine beliebige Taste drücken.

+9

Es ist eigentlich ziemlich einfach. Klicken Sie mit der rechten Maustaste auf Ihr Projekt in VS und wählen Sie Eigenschaften. Unter dem Debug-Bereich können Sie festlegen, dass ein externes Programm gestartet werden soll. In diesem Fall würde die Batchdatei Ihre Anwendung starten. –

4

Ich neige dazu, system("PAUSE"); zu verwenden, die eine Meldung

Press any key to continue . . .

gibt.

+1

Das ist Windows-spezifisch, denke ich, aber es macht die Arbeit erledigt. – DeusAduro

+0

Sie haben Recht, es ist nur Windows, aber ich habe nur gefunden, dass dies ein Problem in Visual Studio, so dachte, es wäre OK .. – irh

+2

-1 Verwenden Sie keine Systemanrufe für solche Dinge – Patrick

0

Rufen Sie diese Funktion, bevor Sie am Ende der Haupt zurück:

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

Wenn ich Visual Studio bin mit und ich brauche nicht Debuggen ich es nur Ctrl +F5 Tastendruck mit laufen – und verhindert, dass die Konsole geschlossen wird.

3

Ich benutze:

cin.get() 

Ich habe gehört, es war weniger kostspielig als System ("PAUSE") und es funktioniert auf POSIX-Systemen zu. Es gibt eine große link, die darüber ins Detail geht.

+4

Was hat teuer mit allem zu tun? Der ganze Sinn des Codes besteht darin, das Terminalfenster so lange herumzuhängen, bis Sie eine Taste drücken. Wie langsam meinst du das System ("PAUSE") im Vergleich zu z.B. Ihre Reflexe ;-) –

3

Widerstehen Sie der Versuchung, alles zu tun. Gut benannte Befehlszeilenprogramme werden beendet, wenn sie einen Status über ihren Beendigungscode melden. Dadurch können sie in automatisierten Umgebungen skriptfähig und "gute Bürger" sein. Warum zwingt der Benutzer auch in einer interaktiven Umgebung aufgrund der Debugging-Umgebung zu einem zusätzlichen Tastendruck?

Wenn Sie ausführen, anstatt zu debuggen, dann öffnet Visual Studio ein Konsolenfenster, das nach dem Beenden der Anwendung angehalten wird, so dass Sie die Ausgabe weiterhin anzeigen können. Ich weiß nicht, warum das Verhalten beim Debuggen anders ist, vielleicht weil Sie Haltepunkte zur Verfügung haben. Wenn Sie die Ausgabe in verschiedenen Phasen sehen möchten, können Sie Haltepunkte nach den entsprechenden Ausgabeanweisungen platzieren oder am Ende von main oder verschiedene aktivieren Optionen für 'Ausnahmeschlag stoppen'.

Aus welchem ​​Grund auch immer, ich habe mich nie gezwungen gefühlt, das Verhalten meiner Anwendung zu kompromittieren, nur um meine Debugging-Erfahrung zu verbessern.

+0

+1 für den Unterschied im Verhalten von Lauf vs. Debug. –

1

Die "Do not do that" Antworten in diesem Thread mögen kurz erscheinen, aber sie sind ziemlich vernünftig. Ich bin über diese Frage hinweggekommen, weil ich eine gtest-Suite debugge, die früher gut lief, aber nun beim Starten mysteriös abstürzt. Wenn es von der Konsole aus gestartet wird, erscheint ein Dialog mit der Meldung "blah.exe funktioniert nicht mehr"; Wenn sie jedoch vom Debugger ausgeführt wird, wird die Konsole für einen Moment angezeigt, verschwindet und das Programm wird mit dem Status 0 beendet.

Ich hätte darüber nachdenken sollen, wie merkwürdig dieser Unterschied im Verhalten war, aber stattdessen war ich wie: "Aw, Mann - ich muss das Konsolenfenster aufrecht halten, damit ich sehen kann, was es sagt." Recht?

Es stellt sich heraus, dass die Maschine, an der ich arbeite (ein Kollege von mir), die 'Befehlsargumente' für den Debugger auf '--gtest_filter = * testMsg *' gesetzt hat. Ich habe das sofort bemerkt, aber es ist mir nie in den Sinn gekommen, dass alle Tests, die zu dem Filter passen, kürzlich in einem Commit umbenannt wurden. Also, wenn es vom Debugger gestartet wurde, fand gtest keine Tests, die ausgeführt werden konnten, und war einfach zu beenden. Weitere 90 Minuten meines Lebens werde ich nie zurückkommen. (-_-) Ich hätte dieses Teer-Baby viel früher fallen lassen können, wenn meine reflexartige Reaktion nicht gewesen wäre zu denken, dass ich dieses Konsolenfenster brauchte, um offen zu bleiben, um das Problem zu lösen ...

Verwandte Themen