C++ - Mantenga abierta la ventana de la consola?


Mi pregunta es súper simple, pero estoy haciendo la transición de C# a C++, y me preguntaba qué comando mantiene abierta la ventana de la consola en C++.

Sé que en C#, la forma más básica es:

Console.ReadLine();

O si desea dejar que el usuario presione cualquier tecla, es:

Console.ReadKey(true);

¿Cómo se hace esto en C++? La única razón por la que hago esta simple pregunta aquí, es que no he podido encontrar una respuesta buena y clara en Internet.

Author: Abel, 2009-12-15

11 answers

¿Qué tal std::cin.get();?

Además, si está utilizando Visual Studio, puede ejecutar sin depurar (CTRL-F5 por defecto) y no cerrará la consola al final. Si lo ejecuta con depuración, siempre puede poner un punto de interrupción en la llave de cierre de main().

 53
Author: Cogwheel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-15 16:22:41

El camino correcto

cin.get();

cin.get() es compatible con C++ y portátil. Recuperará el siguiente carácter de la entrada estándar (stdin). El usuario puede presionar enter y su programa continuará ejecutándose, o finalizará en nuestro caso.

Toma de Microsoft

Microsoft tiene un artículo de la Base de Conocimientos titulado Evitando que la Ventana de la Consola Desaparezca . Describe cómo pausar la ejecución solo cuando es necesario, es decir, solo cuando el usuario tiene generó una nueva ventana de consola ejecutando el programa desde el explorador. El código está en C que he reproducido aquí:

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

He usado esto yo mismo y es una buena manera de hacerlo, solo bajo Windows, por supuesto. Nota también puede lograr esto no programáticamente bajo windows iniciando su programa con este comando:

cmd /K consoleapp.exe

El camino equivocado

No use ninguno de los siguientes para lograr esto:

system("PAUSE");

Esto ejecutará el comando de Windows 'pause' por generar un nuevo proceso cmd. exe / command. com dentro de su programa. Esto es completamente innecesario y no es portable ya que el comando pause es específico de Windows. Desafortunadamente he visto esto mucho.

getch();

Esto no es parte de la biblioteca estándar de C/C++. Es solo una extensión de compilador y algunos compiladores no lo soportarán.

 20
Author: Mike Weller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-15 18:00:17

Si su problema es retener la ventana de consola dentro de Visual Studio sin modificación de la aplicación (código c) y se está ejecutando con Ctrl + F5 (cuando se ejecuta Ctrl+F5) pero la ventana todavía se está cerrando la sugerencia principal es establecer la opción / SUBSYSTEM:CONSOLE linker en su proyecto de Visual Studio.

Como explica DJMooreTX en http://social.msdn.microsoft.com/Forums/en-US/vcprerelease/thread/21073093-516c-49d2-81c7-d960f6dc2ac6

1) Abre tu proyecto, y vaya al Explorador de soluciones. Si me estás siguiendo en K & R, tu "Solución" será 'hola' con 1 proyecto debajo, también 'hola' en negrita.

  1. Haga clic derecho en el" hola " (o cualquiera que sea el nombre de su proyecto.)

  2. Seleccione "Propiedades" en el menú contextual.

  3. Elija Propiedades de configuración>Enlazador > Sistema.

  4. Para la propiedad" Subsistema " en el panel derecho, haga clic en el cuadro desplegable en la mano derecha columna.

  5. Seleccione " Consola (/SUBSISTEMA: CONSOLA)"

  6. Haga clic en Aplicar, espere a que termine de hacer lo que haga y, a continuación, haga clic en Aceptar. (Si "Aplicar" está en gris, elija alguna otra opción de subsistema, haga clic en Aplicar, luego vuelva y aplique la opción de consola. Mi experiencia es que aceptar por sí solo no funcionará.)

Ahora Boris ' CTRL-F5, esperar a que su programa para compilar y vincular, encontrar la ventana de la consola bajo todos los demás basura en el escritorio, y leer su salida del programa, seguido de la amada " Pulse cualquier tecla para continuar...." pedir.

De nuevo, CTRL-F5 y las sugerencias del subsistema funcionan juntas; no son opciones separadas.

 8
Author: jfseb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-03 18:39:57

Un método más apropiado es usar std::cin.ignore:

#include <iostream>

void Pause()
{
   std::cout << "Press Enter to continue...";
   std::cout.flush();
   std::cin.ignore(10000, '\n');
   return;
}
 4
Author: Thomas Matthews,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-15 17:48:36

También puedes apoyarte un poco en el IDE. Si ejecuta el programa usando el comando " Iniciar sin depurar "(Ctrl+F5 para mí), la ventana de la consola permanecerá abierta incluso después de que el programa termine con " Presione cualquier tecla para continuar . . ." mensaje.

Por supuesto, si desea utilizar el "Golpear cualquier tecla" para mantener su programa en ejecución (es decir, mantener un hilo vivo), esto no funcionará. Y no funciona cuando se ejecuta "con depuración". Pero luego puede usar puntos de interrupción para mantener la ventana abierta.

 2
Author: Daver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-15 16:23:24

En Windows, puede usar _getch() en el

<conio.h>

Cabecera.

 1
Author: DanDan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-15 16:19:47

Si crea una aplicación de consola, la consola permanecerá abierta hasta que cierre la aplicación.

Si ya creaste una aplicación y no sabes cómo abrir una consola, puedes cambiar el subsistema como Consola(/Subsistema:Consola) en configuraciones de proyecto -> enlazador -> sistema.

 0
Author: ufukgun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-15 16:16:26

Aproximadamente el mismo tipo de cosas que has hecho en C#. Llamar getch() es probablemente el más simple.

 0
Author: Jerry Coffin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-15 16:16:59

Uso std::getwchar() en mi entorno que está con el compilador mingw32 - gcc-4.6.2, Aquí hay un código de ejemplo.

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

using namespace std;

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

    cout << "Press any key to exit." << endl;
    getwchar();
    return 0;
}
 0
Author: isu3ru,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-07 12:04:44

Como dice Thomas, el cin ignore es una buena manera. Para esperar siempre a que el usuario presione enter (incluso si se usa exit), registre una función 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
Author: S. Paris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-07 14:08:51

Hey primero que nada para incluir funciones de c++ debes usar

Incluye<iostream.h> en lugar de stdio .h

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

Gracias

 -2
Author: ankur ranjan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-10 07:31:15