it-swarm.com.de

C++ - Halten Sie das Konsolenfenster offen?

Meine Frage ist super einfach, aber ich wechsle von C # zu C++ und frage mich, welcher Befehl das Konsolenfenster in C++ geöffnet hält.

Ich weiß in C #, der grundlegendste Weg ist:

Console.ReadLine();

Oder wenn Sie den Benutzer eine beliebige Taste drücken lassen möchten:

Console.ReadKey(true);

Wie machen Sie das in C++? Der einzige Grund, warum ich diese einfache Frage hier stelle, ist, dass ich im Internet keine gute und eindeutige Antwort gefunden habe.

35
Alex

Wie wäre es mit std::cin.get();?

Wenn Sie Visual Studio verwenden, können Sie auch ohne Debuggen (standardmäßig STRG-F5) ausführen. Die Konsole wird am Ende nicht geschlossen. Wenn Sie es mit Debugging ausführen, können Sie immer einen Haltepunkt an der schließenden Klammer von main() setzen.

56
Cogwheel

Der richtige Weg

cin.get();

cin.get() ist C++ - kompatibel und portabel. Das nächste Zeichen wird von der Standardeingabe (stdin) abgerufen. Der Benutzer kann die Eingabetaste drücken und Ihr Programm wird dann weiter ausgeführt oder in unserem Fall abgebrochen.

Microsofts take

Microsoft hat einen Knowledge Base-Artikel mit dem Titel Verhindern des Verschwindens des Konsolenfensters . Es beschreibt, wie die Ausführung nur angehalten wird, wenn dies erforderlich ist, d. H. Nur wenn der Benutzer ein neues Konsolenfenster erstellt hat, indem er das Programm vom Explorer aus ausführt. Der Code ist in C, den ich hier wiedergegeben habe: 

#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();
        }
}

Ich habe das selbst benutzt und es ist ein schöner Weg, natürlich nur unter Fenstern. Beachten Sie auch, dass Sie dies nicht programmgesteuert unter Windows erreichen können, indem Sie Ihr Programm mit diesem Befehl starten:

cmd /K consoleapp.exe

Der falsche Weg

Verwenden Sie keine der folgenden Möglichkeiten, um dies zu erreichen:

system("PAUSE");

Dadurch wird der Windows-Befehl "Pause" ausgeführt, indem ein neuer Prozess cmd.exe/command.com in Ihrem Programm gestartet wird. Dies ist sowohl völlig unnötig als auch nicht portierbar, da der Befehl pause Windows-spezifisch ist. Ich habe das leider viel gesehen.

getch();

Dies ist nicht Teil der C/C++ - Standardbibliothek. Es ist nur eine Compiler-Erweiterung, die von einigen Compilern nicht unterstützt wird. 

21
Mike Weller

Wenn das Problem besteht, dass das Konsolenfenster in Visual Studio beibehalten wird, ohne dass Ihre Anwendung geändert hat (C-Code) Und es mit Strg + F5 ausgeführt wird (wenn Strg + F5 ausgeführt wird), das Fenster jedoch noch geschlossen wird Der wichtigste Hinweis besteht darin, die Linker-Option/SUBSYSTEM: CONSOLE in Ihrem Visual Studio-Projekt festzulegen. 

wie von DJMooreTX in http://social.msdn.Microsoft.com/Forums/en-US/vcprerelease/thread/21073093-516c-49d2-81c7-d960f6dc2ac6 erklärt. 

1) Öffnen Sie Ihr Projekt und gehen Sie zum Projektmappen-Explorer. Wenn Sie mir in K & R folgen, wird Ihre "Lösung" mit einem Projekt darunter "Hallo" sein, auch "Hallo" in Fettdruck.

  1. Klicken Sie mit der rechten Maustaste auf das "Hallo" (oder wie auch immer Ihr Projektname ist.)

  2. Wählen Sie "Eigenschaften" aus dem Kontextmenü.

  3. Wählen Sie Konfigurationseigenschaften> Linker> System.

  4. Klicken Sie für die Eigenschaft "Subsystem" im rechten Fensterbereich auf das Dropdown-Feld in der rechten Spalte.

  5. Wählen Sie "Konsole (/ SUBSYSTEM: CONSOLE)"

  6. Klicken Sie auf Übernehmen und warten Sie, bis der Vorgang abgeschlossen ist. Klicken Sie anschließend auf OK. (Wenn "Übernehmen" deaktiviert ist, wählen Sie eine andere Subsystemoption aus, klicken Sie auf Übernehmen, gehen Sie zurück und wenden Sie die Konsolenoption an. Meine Erfahrung ist, dass OK an sich nicht funktioniert.)

Führen Sie nun die STRG-F5 von Boris aus, warten Sie, bis Ihr Programm kompiliert und eine Verknüpfung hergestellt hat, finden Sie das Konsolenfenster unter dem anderen Junk auf Ihrem Desktop, und lesen Sie die Ausgabe Ihres Programms, gefolgt von der beliebten Taste "Drücken Sie eine beliebige Taste, um fortzufahren .... "Prompt.

Wieder arbeiten CTRL-F5 und die Subsystemhinweise zusammen. Sie sind keine separaten Optionen.

8
jfseb

Eine geeignetere Methode ist die Verwendung von std::cin.ignore

#include <iostream>

void Pause()
{
   std::cout << "Press Enter to continue...";
   std::cout.flush();
   std::cin.ignore(10000, '\n');
   return;
}
4
Thomas Matthews

Sie können sich auch ein wenig auf die IDE stützen. Wenn Sie das Programm mit dem Befehl "Ohne Debuggen starten" ausführen (Strg + F5 für mich), bleibt das Konsolenfenster auch nach dem Beenden des Programms mit "Drücken Sie zum Fortfahren eine beliebige Taste. Botschaft. 

Wenn Sie die "Hit any key" -Taste verwenden möchten, um Ihr Programm am Laufen zu halten (d. H. Einen Thread am Leben halten), funktioniert dies natürlich nicht. Und es funktioniert nicht, wenn Sie "mit Debugging" ausführen. Dann können Sie jedoch Haltepunkte verwenden, um das Fenster offen zu halten.

2
Daver

In Windows können Sie _getch() in verwenden 

<conio.h>

header.

1
DanDan

wenn Sie eine Konsolenanwendung erstellen, bleibt die Konsole geöffnet, bis Sie die Anwendung schließen.

wenn Sie bereits eine Anwendung erstellt haben und nicht wissen, wie eine Konsole geöffnet wird, können Sie das Subsystem als Konsole (/ Subsystem: Konsole) in Projektkonfigurationen -> Linker -> System ändern.

0
ufukgun

In etwa die gleichen Dinge, die Sie in C # ausgeführt haben. Der Aufruf von getch() ist wahrscheinlich der einfachste.

0
Jerry Coffin

Wie Thomas sagt, ist Cin ignorieren ein guter Weg. Um immer darauf zu warten, dass der Benutzer die Eingabetaste drückt (auch wenn exit verwendet wird), registrieren Sie eine Funktion 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
S. Paris

Ich verwende std::getwchar() in meiner Umgebung, die sich mit dem Compiler mingw32 - gcc-4.6.2 befindet. Hier ist ein Beispielcode.

#include <iostream>
#include "Arithmetics.h"

using namespace std;

int main() {
    ARITHMETICS_H::testPriorities();

    cout << "Press any key to exit." << endl;
    getwchar();
    return 0;
}
0
isu3ru