Estoy empezando en Visual C++ y me gustaría saber cómo mantener la ventana de la consola.

Por ejemplo, este sería un típico «hola mundo» de la aplicación:

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

¿Cuál es la línea que me falta?

  • Amruth A. Pillai el código no muestra el mensaje «presione cualquier tecla para continuar» gracias
  • Usted puede imprimir usted mismo con un simple std::cout llamada.
  • La desventaja de todas las soluciones propuestas es que ninguna de ellas funciona con la depuración (Ctrl+F5 falla aquí) y cuando la aplicación se detiene inesperadamente (todos los puntos de interrupción o lee de stdin en el principal de retorno fallar aquí). Lo que me gustaría ver es un IDE ventana de la consola como Eclipse y otros IDEs tienen. Simplemente seguir mostrando la salida a stdout/stderr después de que el programa ha terminado.
  • El aceptó responder funciona con CTRL+F5, y ¿por qué quieres una solución que funciona con la depuración (F5)? Seguramente el punto entero de la depuración es .. depuración? ¿Cuál es el beneficio de tener una pausa de la consola después de la terminación del programa, en una sesión de depuración?
  • Eclipse y otros IDEs permiten leer el contenido de su programa de salida, incluso después de que el proceso ha finalizado. Sin duda se ve el beneficio añadido, especialmente cuando se trata de encontrar un bug? También un punto de interrupción sólo funciona cuando usted sabe dónde está el programa está terminando, que puede ser difícil saber cuando la salida desaparece de la pantalla.
  • Podría tal vez aclarar con un ejemplo de cuando sería útil durante una sesión de depuración para ver el resultado final de un terminado el programa? La forma en que lo veo, si usted está interesado sólo en la inspección final de salida, a continuación, CTRL-F5 es superior ya que se inicia más rápido. Y si usted necesita más que eso, entonces es necesario el paso a través o establecer un punto de interrupción de todos modos, en cuyo caso el problema de no saber el punto de terminación es discutible. Por definición, si el programa se ejecuta directamente a través de la terminación sin interacción del desarrollador/inspección, entonces usted no está depurando.
  • Personalmente creo que hay una diferencia entre el general «depuración» y la «utilización de la VS depurador paso a través del programa». También, a veces, no sé que quiero leer algunas registra la salida, hasta después de la terminación del programa. Otra razón podría ser que la causa de la terminación es en el mismo bit de código (por ejemplo una 3ra parte de la biblioteca) que produce el resultado que quiero leer. Que la biblioteca de la llamada es ejecutado (impresiones de salida, a continuación, finaliza) o no (imprime sin salida).
  • nunca agregar una cout << «Prueba»; para comprobar si una función se llama?
  • claro, pero eso es irrelevante. No veo la ventaja de Visual Studio activamente la eliminación de resultados del programa después de la terminación, yo sólo veo desventajas.
  • Posibles duplicados de la Prevención de la ventana de la consola de cierre en Visual Studio C/C++ aplicación de Consola

InformationsquelleAutor Raúl Roa | 2009-01-18

21 Comentarios

  1. 379

    Iniciar el proyecto con Ctrl+F5 en lugar de sólo F5.

    La ventana de la consola ahora permanecen abiertos con el Press any key to continue . . . mensaje después de que el programa se cierra.

    Tenga en cuenta que esto requiere la Console (/SUBSYSTEM:CONSOLE) opción del vinculador, que se puede habilitar como sigue:

    1. Abra su proyecto, y vaya al Explorador de soluciones. Si usted está siguiendo junto a mí en K&R, su «Solución» será ‘hola’ con 1 proyecto en virtud de ello, también ‘hola’ en negrita.
    2. Clic derecho en el «hola» (o cualquiera que sea el nombre del proyecto es).
    3. Elija «Propiedades» en el menú contextual.
    4. Elija Propiedades de Configuración>Enlazador>Sistema.
    5. Para el «Subsistema» de la propiedad en el panel de la derecha, haga clic en el cuadro desplegable en la columna de la derecha.
    6. Elegir «de la Consola (/SUBSYSTEM:CONSOLA)»
    7. Haga clic en Aplicar, espere a que termine de hacer lo que hace, a continuación, haga clic en ACEPTAR. (Si «Aplicar» es de color gris, elegir algún otro subsistema de opción, haga clic en Aplicar y, a continuación, volver y aplicar la opción consola. Mi experiencia es que ACEPTAR por sí mismo no funciona).

    CTRL-F5 y el subsistema de sugerencias de trabajar juntos; que no son otra opción.

    (Cortesía de DJMorreTX de http://social.msdn.microsoft.com/Forums/en-US/vcprerelease/thread/21073093-516c-49d2-81c7-d960f6dc2ac6)

    • Esto ejecuta el programa sin depuración; es mejor tener una solución que funciona tanto en la depuración ordinaria y modo de ejecución.
    • Para alguien que no pueda obtener esta solución para trabajar en un proyecto de make, esto es debido a un error en Visual Studio. He publicado una respuesta con la solución.
    • Puede confirmar! Había una aplicación de consola que no trabajo de esto y de lo trabajado. Usted no necesita cambiar su código con cin.get(),getchar(), system("pause") o cualquier otra basura. Cambio de esto funciona.
    • Ctrl+F5 significa «Iniciar Sin Depurar’. Así que usted no puede utilizar este proceso de depuración. Sólo añadir system("pause"); en el final de su código. Tiene sentido y funciona bien.
  2. 41

    La forma estándar es cin.get() antes de su devolución.

    int _tmain(int argc, _TCHAR* argv[])
    {
        cout << "Hello World";
        cin.get();
        return 0;
    }
    • Sé que desde que el programa ya está en el uso de cout, que ya han sido atendidos, pero creo que vale la pena mencionar que necesitará #include <iostream> así como utilizar el espacio de nombres std: std::cin.get().
    • Esto funciona, pero la combinación de teclas Ctrl+F5 es mucho mejor, especialmente cuando el seguimiento global de la destrucción de objetos, etc.
    • Esta es una mala solución — ¿y si el programa sale a través de la salida (el)?
    • -1 para _tmain. Yo iba a votar otra -1 para el cin.get() en vez de poner un punto de interrupción para F5 o con las teclas Ctrl + F5. Pero yo soy sólo les permite una downvote.
    • Lo que está mal con _tmain? Esa es la forma estándar de escribir una aplicación de Windows de la orientación de la Consola de subsistema. Desviarse de que la norma es lo que sería una mala práctica. Claramente, nadie está hablando de código portable aquí; la pregunta dice de Visual C++ y _tmain es la firma que aparece en el código de ejemplo. Es hora de renunciar a esta religión. Windows es «no-estándar» por defecto, y hay muy buenas razones para seguir su de los estándares.
    • Mi downvote para _tmain es porque es totalmente innecesario no-estándar (el internacional estándar de C++ requiere una llanura main), y debido a que utiliza Microsoft T macro esquema, que es innecesaria complicación y verborrea para el soporte de Windows 9x. Si usted siente que desviarse de la norma es mala práctica, entonces usted no debe utilizar tmain. No hay buenas razones para el uso de tmain, excepto para pesca de arrastre o, para los profesionales, para mostrar una total incompetencia.
    • Este es un hack. Si está utilizando visual studio utiliza el método correcto, que es el que plantea Zoidberg. Si usted no está utilizando visual studio, a continuación, tienen el IDE, Make, lo que sea, ejecutar un archivo por lotes que se ejecuta el resultado binario, luego de la pausa, de manera que la ventana no se cierra.
    • «La forma estándar»? Sin duda, este es «Un camino»?
    • Esto no es un hack; esto es el uso de la lengua para hacer lo que el lenguaje debe ser capaz de hacer. Confiando en el IDE es el descuidado opción.
    • Es un hack porque está utilizando el código de dirección no-relacionados con el código de problema. El OP quiere «mantener abierta la ventana de consola» después de ejecutar su código en el IDE. Esta solución hará que el programa de pausa, si se ejecuta en el IDE o no, y si usted ya tiene un no-cierre de la ventana de la consola o no – una totalmente diferente resultado. ¿Crees que el usuario final del programa quiere arbitraria de pausa cada vez que se ejecuta, simplemente porque el desarrollador necesitaba de su ventana de la consola de mantener abierta mientras él estaba escribiendo? No tanto el problema, y la solución debe estar en el IDE, no el programa.
    • La clave para entender el problema con esta solución es la comprensión de que mantener una ventana de consola abierta (que la pregunta quiere), y pausar el programa (que la respuesta resuelve), son no de la misma cosa. Mantener abierta la ventana de consola pasa a ser un efecto secundario de la pausa en el programa, que es por qué esta respuesta funciona, pero es un hack. Por desgracia, en la mayoría de los casos, un carácter de pausa no es una característica deseable para un programa de consola, que son, casi invariablemente, ejecutar en la línea de comandos, o se ejecutan en segundo plano por algún otro proceso.
    • Tal derroche de energía en una discusión. «La clave para la comprensión de la cuestión…» Es darse cuenta de que no hay un problema, y esto no es nada que valga la pena discutir más.

  3. 24

    Poner un punto de interrupción en la return línea.

    Que se ejecuta en el depurador, ¿verdad?

    • la mayoría de las veces difícil como puede haber varios puntos de salida dentro del programa
    • El programa no se inicia debido a que falta DLL, y nunca golpear a ese punto de interrupción
  4. 17

    Otra opción es utilizar

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

    Aunque esto no es muy portable, ya que sólo funciona en Windows, pero se imprimirá automáticamente

    Presione cualquier tecla para continuar…

    • system(«pause») mantendrá su procesador se ejecuta, no debe ser utilizado. El uso de un cin.get() o equivalente.
    • system se declara en <stdlib.h>.
    • Yo sólo lo intentó y no consumen el 100% de la CPU. Mi uso del procesador estaba en 0% – 1% todo el tiempo. No se puede reproducir.
    • system(«pause») llama la «pausa» de comandos en cmd, que NO hace uso de la CPU todo el tiempo. Es equivalente a _getche() esencialmente.
  5. 7

    Para makefile proyectos, la aceptación de la solución de falla, debido a un error en Visual Studio (que está presente al menos hasta la versión 2012 – todavía no he probado 2013). Este error es el que se detalla aquí.

    Con el fin de tener la consola pausa después de la terminación del programa en un archivo make proyecto, siga estos pasos (esto puede variar para otras versiones de 2010 – 2012):

    1) el Paso /SUBSYSTEM:CONSOLE para el enlazador.EDITAR: ver más abajo.

    2) Abra el archivo de proyecto (.vcxproj) en un editor de texto.

    3) en el Interior de la raíz <project> etiqueta, introduzca el siguiente:

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

    4) volver a Cargar el proyecto en su solución.

    5) Ejecutar el programa sin depurar (CTRL + F5).

    EDICIÓN:

    Según mi comentario a continuación, ajuste la opción del vinculador /SUBSYSTEM:CONSOLE en realidad es irrelevante para el makefile proyectos (y no necesariamente incluso es posible, si usted está usando un compilador distinto de MSVC). Todo lo que importa es que el valor se añade a la .archivo vcxproj, como por el paso 3 anterior.

    • Nunca he oído hablar de que en el paso 3 anterior. Estás seguro de que es necesaria y funciona?
    • Sí, y después de mis comentarios en su respuesta aquí, he descubierto ahora que pasa /SUBSYSTEM:CONSOLE para el enlazador en realidad es irrelevante – paso 3 es todo lo que importa. Ten en cuenta que mi respuesta se refiere a makefile proyectos – en un proyecto de make, el IDE no tiene manera de saber qué está pasando para que el enlazador (incluso podría no ser el uso de un compilador que tiene un /SUBSYSTEM:CONSOLE opción), y es el proyecto en sí, que sigue la pista de si está o no está destinado a ser un programa de consola. Voy a editar mi respuesta en consecuencia.
    • También puedo confirmar que voy a usar esta solución de mí mismo en un proyecto de make, con SCons como el sistema de generación, y MSVC y MinGW como compiladores. No hay otra manera que yo conozco para obtener el IDE para pausar la consola después de la terminación de la no-modo de depuración.
    • Estoy tratando de utilizar Scons de la misma manera, gracias por tu respuesta! Hiciste para configurar Scons para que genere proyectos con esa etiqueta?
    • Me temo que no, mi flujo de trabajo fue la otra manera alrededor, llamando SCons de VS. Yo inicialmente creado manualmente mi VS makefile proyectos, de modo que pasaron las variables de configuración para mi SCons de secuencia de comandos (por ejemplo, de 32/64 bits, compilador nombre, release/depuración), que gestiona el resto de la lógica. En que el programa de instalación no era necesario para los archivos de proyecto a cambiar nunca, así que yo no uso ninguna de auto-generación de la característica de los SCons. Desde entonces he cambiado a Linux, así que no utiliza VS más. Ya que es un VS de error, puede ser que valga la presentación de una solicitud para SCons para manejar el necesario paso extra.
    • Alternativamente, usted puede incluir algún código de Python en su SCons script para hacer lo mismo cada vez que un archivo de proyecto se genera. Creo que VS archivos de proyecto se ajustan a la norma XML, así que debe ser bastante fácil para agregar los elementos que faltan, y sólo requieren unas pocas líneas de código. Me permito sugerir a partir de aquí (para Python 2.x) o aquí (3.x). Esta respuesta también puede ser de interés.
    • Impresionante! Esto funciona para mí en Visual Studio Comunidad De 2015 1 de la Actualización. Tenga en cuenta que el <project> etiqueta para mí era algo así: <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">. Saludos.

  6. 4

    Puede utilizar cin.get(); o cin.ignore(); justo antes de la instrucción return para evitar que la ventana de la consola de cierre.

  7. 4

    sólo hay que poner un punto de interrupción en la última llave de la principal.

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

    funciona para mí, no hay necesidad de ejecutar sin depurar. También ejecuta los destructores antes de golpear el punto de interrupción, de modo que usted puede comprobar cualquiera de los mensajes de la impresión en estos destructores si usted tiene alguna.

  8. 3

    Simplemente añadir un punto de interrupción para el corchete de cierre de su _tmain método. Esta es la manera más fácil y además no tendrá que agregar código a fin de depurar.

  9. 2

    Lugar un punto de interrupción en la final abrazadera de main(). Será disparado incluso con múltiples return declaraciones. El único inconveniente es que una llamada a exit() no ser atrapado.

    Si usted no está de depuración, siga los consejos del Zoidberg la respuesta de iniciar el programa con Ctrl+F5 en lugar de sólo F5.

  10. 2

    Mis 2 Centavos:

    Opción 1: Agregar un punto de interrupción en la final de main()

    Opción 2: Añadir este código, justo antes de la 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');

    Deberá incluir <iomanip> para std::numeric_limits

    • por último, una gran solución!!!
  11. 2

    acaba de agregar system(«pause») al final del código antes del return 0 como este

    #include <stdlib.h>
    
    int main()
    {
        //some code goes here
        system("pause")
        return 0;
    }
  12. 2

    cin.get(), o system("PAUSE").
    No he oído que usted puede utilizar return(0);

  13. 1

    Puedo incluir #include <conio.h> y, a continuación, agregar getch(); justo antes de la return 0; línea. Eso es lo que aprendí en la escuela de todos modos. Los métodos anteriormente mencionados aquí son bastante diferentes de lo que yo veo.

    • -1: Aparte del hecho de que tener el programa en sí pausa es generalmente la solución equivocada (ya que en la mayoría de los casos que no es el comportamiento que usted quiere que su liberados binario a tener), conio.h es no-estándar, anticuado, y es una de encabezado de C, no C++! Por desgracia, hay un montón de malas prácticas que se enseñan en las escuelas.
    • Uno espera que este sea utilizado durante el ensayo sólo, no es algo que le gustaría seguir en la versión final. Si eres de codificación para Windows ¿cuál es el problema con #include <conio.h> / _getch();? Es quicked a escribir de cin.get(), no requiere de pulsar 2 teclas (al menos un carácter+enter), y no funciona sólo en depuración o sólo en modo de lanzamiento. ¿Qué hay de malo entonces?
  14. 1

    Tenía el mismo problema. Estoy usando _getch() justo antes de la instrucción return. Funciona.

    • Puede que desee agregar ejemplos y explicaciones para el código, especialmente para una pregunta/respondida hace mucho tiempo. Además, la respuesta es funcionalmente idéntico a varios mayores respuestas, y utiliza la misma llamada, como otro de respuesta existente.
  15. 0

    (Algunas de las opciones puede ser llamado por diferentes nombres. Yo no uso la versión en inglés)

    Tuve el mismo problema, cuando los proyectos creados con la opción «empty project», Crear un proyecto como «Win32 console application» en lugar de «proyecto vacío» . En el cuadro de diálogo que aparece ahora, presiona el botón «continuar», y después de que usted puede marcar la opción «empty project» y pulse confirmar. Después de que las teclas CTRL + F5 abrirá una consola que no se cierra automáticamente.

  16. 0

    Tuve el mismo problema, En mi aplicación hay varias exit() puntos y no había manera de saber exactamente dónde sale, luego me enteré de esto:

    atexit(system("pause"));

    o

    atexit(cin.get());

    De esta manera se va a detener, no importa donde volvemos a salir en el programa.

    • Ninguno de esos son válidas las llamadas a atexit. atexit toma un puntero a función, no es un entero.
  17. 0

    Otra opción:

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

    Principal:

    int main(int argc, char* argv[]) {
        MAINRET;
    }
  18. 0

    Realidad, la verdadera solución es la selección de la plantilla del proyecto en sí.
    Usted DEBE seleccionar la Aplicación de Consola Win32 en mayores de VS, o rellenar el nombre del proyecto y luego haga doble clic en el Escritorio de Windows asistente y, a continuación, seleccione aplicación de consola Win32. A continuación, seleccione el proyecto vacío en este punto. Esto permite lo que el interrogador realmente quería, sin añadir punto de parada y mantener el código.
    Fui a través de este problema así. La respuesta es también en el sitio de MSDN.

  19. 0

    He aquí una manera de mantener la ventana de comandos abrir, independientemente de cómo se detiene la ejecución sin modificar el código:

    En Visual Studio, abra Páginas de propiedades del Proyecto -> Depuración.

    Para Comando, introduzca $(ComSpec)

    Para Argumentos del Comando, introduzca /k $(TargetPath). Anexar los argumentos para su propia aplicación.

    Ahora F5 o Ctrl-F5 ejecuta Windows/System32/cmd.exe en una nueva ventana, y /k asegura que el símbolo del sistema permanece abierto tras la ejecución completa.

    La desventaja es que la ejecución no se detendrá en los puntos de interrupción.

  20. -1

    que sólo puede poner
    keep_window_open ();
    antes del regreso aquí es un ejemplo

    int main()
    {
        cout<<"hello world!\n";
        keep_window_open ();
        return 0;
    }
    • ¿De dónde keep_window_open() vienen de, por ejemplo, que el archivo de encabezado & biblioteca?

Dejar respuesta

Please enter your comment!
Please enter your name here