2009-11-21 115 views
345

Esta es probablemente una pregunta embarazosa, ya que sin duda la respuesta es absolutamente obvia.Evitar que se cierre la ventana de la consola en la aplicación Visual Studio C/C++ Console

He usado Visual Studio durante años, pero esta es la primera vez que hago un desarrollo de 'Aplicación de consola'.

Cuando ejecuto mi aplicación aparece la ventana de la consola, aparece la salida del programa y luego la ventana se cierra cuando la aplicación sale.

¿Hay alguna manera de mantenerlo abierto hasta que haya comprobado la salida o ver los resultados después de que se haya cerrado la ventana?

+0

Monodevelop hace lo que usted está esperando. –

Respuesta

354

Si ejecuta sin depuración (Ctrl + F5), de manera predeterminada, le solicita que presione volver para cerrar la ventana. Si desea utilizar el depurador, debe poner un punto de interrupción en la última línea.

+197

Si tiene una aplicación C++ y Ejecutar sin depurar y la ventana de la consola aún se cierra, debe recordar establecer explícitamente el subsistema a la consola en Propiedades de configuración/Enlazador/Sistema. Esto puede suceder si comienzas con un proyecto vacío, que deja el subsistema sin establecer. –

+2

También puede agregar el botón Iniciar sin depuración a cualquier barra de herramientas/menús que desee, si va en el diálogo 'Herramientas-> Personalizar ...'. – mwfearnley

+2

No funcionó para mí :(La ventana de la consola se abre y se cierra inmediatamente, pero el registro se detiene y espera una pulsación adicional de F5 – CodyBugstein

19

Si está utilizando .NET, ponga Console.ReadLine() antes del final del programa.

Esperará <ENTER>.

+6

+1 - O eso o 'Console.ReadKey()' para simplemente esperar por cualquier tecla. –

+30

-1, modificando el código para trabajar alrededor del IDE – binki

+0

Extraño, esto no tiene ningún efecto en mi aplicación. Todavía se cierra sin esperar la entrada del usuario. – Kokodoko

2

Puede ejecutar su ejecutable desde el símbolo del sistema. De esta forma puedes ver toda la salida. O bien, puede hacer algo como esto:

int a = 0; 
scanf("%d",&a); 

return YOUR_MAIN_CODE; 

y de esta manera se cierra la ventana sería hasta que introduzca los datos de la variable a.

2

add "| pause "en el cuadro de argumentos del comando en la sección de depuración en las propiedades del proyecto.

+4

Esta sería una gran solución si funcionó. 'pause' parece funcionar solo en archivos por lotes, y mientras recibe datos de su programa en STDIN, no vuelve a imprimir ese texto. Traté de reemplazar '|' con '&&', pero no tuvo ningún efecto, presumiblemente porque no se está ejecutando con un shell de comandos (cmd.exe). –

-3

Utilice console.readline. El tuyo está escribiendo la línea pero no leyéndola.

40

Aquí es una manera para C/C++:

#include <stdlib.h> 

#ifdef _WIN32 
    #define WINPAUSE system("pause") 
#endif 

poner esto en la parte superior de su programa, y ​​si es en un sistema Windows (#ifdef _WIN32), entonces se creará una macro llama WINPAUSE. Cuando quiera que su programa se detenga, llame al WINPAUSE; y pausará el programa, utilizando el comando DOS. Para otros sistemas como Unix/Linux, la consola no debería salir al salir del programa de todos modos.

+0

Me gusta este método lo mejor. – Erutan409

+0

Este método no funciona en Visual C++ (a menos que incluya algún encabezado?) – wmac

+1

@wmac Debe incluir el encabezado windows.h – Geowil

24

Goto depuración Menú-> Prensa StartWithoutDebugging

+0

Esto ni siquiera es una opción en VS 2008 a menos que se elija C# Development Environment. CTRL + F5 funciona bien. También puede agregar esto como un botón a la barra de herramientas a través de Herramientas> Personalizar. – perry

+0

Si tiene varios proyectos, establezca el relevante como el proyecto de inicio –

+0

¡Excelente! Esto funciona incluso en VS 2017. – Christophe

135

clic derecho en su proyecto

Propiedades> Propiedades de configuración> Enlazador> Sistema

seleccione Consola (/ SUBSISTEMA: CONSOLA) en la opción SubSystem.

Ahora probarlo ... que debería funcionar

+0

Esto funcionó para mi VS2013 Express, pero la respuesta aceptada no. Muy extraño, ya que la respuesta aceptada ha funcionado para todas las versiones de Visual Studio que he usado en el pasado. –

+0

Esta debería ser la respuesta aceptada incluida con la respuesta aceptada actual. – Ryan

+4

@MichaelCalvin Tienes que correr con Ctrl + F5 después de configurar esto, ese es el kicker. –

11

intenta llamar getchar() justo antes main() devoluciones.

+0

No funciona en VS 2008 para una aplicación de consola Hello Name simple. cout, cin, cout, getchar(), la consola aún se cierra. ¿Cual es el trato? – perry

+1

Intenta poner getchar() dos veces si tienes una cita justo antes de getchar(). getchar() espera un char y ya lo estás dando con cout ... Avísame si esto ayuda :) – Magarusu

9

(/ SUBSYSTEM: CONSOLA) no funcionó para mi vs2013 (ya lo tenía).

"ejecutar sin depurar" no es una opción, ya que no quiero cambiar entre la depuración y la salida.

que terminó con

int main() { 
    ... 
#if _DEBUG 
    LOG_INFO("end, press key to close"); 
    getchar(); 
#endif // _DEBUG 
    return 0; 
} 

solución utilizada en QtCreator pre 2.6. Ahora mientras qt crece, vs va de otra manera. Según recuerdo, en el año 2008 no necesitamos esos trucos.

+0

Sin embargo, funciona en VS 2015. –

2

Simplemente presione CNTRL + F5 para abrirlo en una ventana de línea de comando externa (Visual Studio no tiene control sobre él).

Si esto no funciona, a continuación, añadir lo siguiente al final del código:

Console.WriteLine("Press any key to exit..."); 
Console.ReadKey(); 

esta espera a que se pulse una tecla para cerrar la ventana de terminal una vez que el código ha llegado al final.

Si desea hacer esto en varios lugares, coloque el código anterior en un método (por ejemplo, private void Pause()) y llame al Pause() cuando un programa llegue a un posible fin.

+0

cuando hago el cntrl + f5 se abre y luego se cierra de inmediato? ¿Cómo arreglas eso? – Callat

+0

Leer mi edición ... – carefulnow1

+0

¡La segunda solución era lo que estaba buscando! – RoG

6

he aquí una solución que (1) no requiere ningún cambio de código o puntos de ruptura, y (2) se detiene después de la terminación del programa de manera que se puede ver todo lo que fue impreso. Pausará después de F5 o Ctrl + F5. El principal inconveniente es que en VS2013 Express (como se probó), no carga símbolos, por lo que la depuración es muy restringida.

  1. Cree un archivo por lotes. Llamé a la mina runthenpause.bat, con el siguiente contenido:

    %1 %2 %3 %4 %5 %6 %7 %8 %9 
    pause 
    

    La primera línea se ejecutará el comando que proporcione y hasta ocho argumentos. La segunda línea ... pausará.

  2. Abra las propiedades del proyecto | Propiedades de configuración | Depuración.

  3. Cambia "Argumentos de comando" a $(TargetPath) (o lo que sea en "Comando").
  4. Cambia "Comando" a la ruta completa al runthenpause.bat.
  5. Pulse OK.

Ahora, cuando se ejecuta, runthenpause.bat pondrá en marcha su aplicación, y después de su aplicación haya finalizado, hará una pausa para que pueda ver la salida de la consola.

Voy a publicar una actualización si descubro cómo cargar los símbolos. Intenté /Z7 por this pero sin éxito.

+1

Aún no es compatible con la depuración, pero al menos soluciona el problema de no poder ver el resultado, p. de VLD, en contraste con ** todas ** otras respuestas. –

-1

Visual Studio , con importaciones. Porque odio cuando los ejemplos de código no proporcionan las importaciones necesarias.

#include <iostream>; 

int main() 
{ 
    getchar(); 
    return 0; 
} 
0

Un poco mejor solución:

atexit([] { system("PAUSE"); }); 

al comienzo de su programa.

Pros:

  • puede utilizar std :: exit()
  • puede tener múltiples retornos de la principal
  • puede ejecutar su programa en el depurador
  • IDE independiente (+ OS independiente si se utiliza el truco cin.sync(); cin.ignore(); en lugar de system("pause");)

Contras:

  • tienen que modificar el código
  • no se detendrá en std :: terminan()
  • todavía va a pasar en su programa fuera de la sesión IDE/depurador; se puede evitar que esto bajo Windows usando:

extern "C" int __stdcall IsDebuggerPresent(void); 
int main(int argc, char** argv) { 
    if (IsDebuggerPresent()) 
     atexit([] {system("PAUSE"); }); 
    ... 
} 
+0

Muy mal consejo. –

+0

¿Puedes explicar por qué? – GhassanPL

+0

En el caso de que uno no esté depurando, no sirve de nada, porque en este caso no hay problema para resolver. En VS solo ejecuta el programa con Ctrl + F5 y eso es todo, entonces no hay problema en VS, y en un intérprete de comandos no hay problema, en resumen, no hay problema. Y en el caso donde uno está depurando y quiere dejar de agregar un código para detenerse, no es una solución más conveniente que un punto de interrupción, e interfiere en las situaciones en las que uno no quiere detenerse. –

3

sólo hay que poner como su última línea de código:

system("pause"); 
Cuestiones relacionadas