2009-02-25 26 views
13

Al usar iostream en C++ en Linux, muestra la salida del programa en el terminal, pero en Windows solo guarda el resultado en un archivo stdout.txt. ¿Cómo puedo, en Windows, hacer que la salida aparezca en la consola?Cómo dar salida a la consola en C++/Windows

Respuesta

15

Como mencionaste stdout.txt lo busqué en Google para ver exactamente qué crearía una stdout.TXT; Normalmente, incluso con una aplicación de Windows, la salida de la consola va a la consola asignada, o a ninguna parte si no está asignada.

Por lo tanto, suponiendo que está utilizando SDL (que es lo único que apareció stdout.txt), debe seguir el consejo here. O bien freopen stdout y stderr con "CON", o las otras soluciones de engarce/compilación allí.

En caso de que el enlace se rompe una vez más, aquí es exactamente lo que se hace referencia desde libSDL:

¿Cómo evitar la creación de stdout.txt y stderr.txt?

"Creo que dentro del proyecto de Visual C++ que viene con SDL hay un objetivo de SDL_nostdio> que puedes construir que hace lo que quieres (TM)."

"Si defines" NO_STDIO_REDIRECT "y recompilas SDL, creo que solucionará el problema." >> (Respuesta por cortesía de Bill Kendrick)

+0

¡Muchas gracias! Esto me ha estado molestando durante bastante tiempo –

2

Su aplicación debe compilarse como una aplicación de consola de Windows.

1

Supongo que está utilizando alguna versión de Visual Studio? En Windows, std::cout << "something"; debe escribir algo en una ventana de consola SI su programa está configurado en la configuración del proyecto como un programa de consola.

4

En primer lugar, ¿qué compilador o entorno de desarrollo está utilizando? Si es Visual Studio, debe crear un proyecto de aplicación de consola para obtener la salida de la consola.

En segundo lugar,

std::cout << "Hello World" << std::endl;

debería funcionar en cualquier aplicación de consola de C++.

+5

No, eso envía a salida estándar, y eso no siempre se escribe en la consola (dependiendo de cómo se asigna). De ahí la pregunta del OP, y la razón por la que leí este hilo casi dos años después. :-) – winwaed

4

Si está utilizando Visual Studio resulta necesario modificar la propiedad proyecto: Propiedades de configuración -> Enlazador -> Sistema -> subsistema.

Esto se debe establecer en: consola (/ SUBSISTEMA: CONSOLA)

También debe cambiar su WinMain que ser de esta firma:

int main(int argc, char **argv) 
{ 
    //... 
    return 0; 
} 
1

Si está utilizando Visual Studio, se debería funcionar bien!

Aquí está un ejemplo de código:

#include <iostream> 

using namespace std; 

int main (int) { 
    cout << "This will print to the console!" << endl; 
} 

Asegúrese de que ha seleccionado una aplicación de consola Win32 al crear un nuevo proyecto. Aún así, puede redirigir la salida de su proyecto a un archivo utilizando el interruptor de la consola (>>). Esto realmente redirigirá la tubería de la consola desde la salida estándar a su archivo. (por ejemplo, myprog.exe >> myfile.txt).

¡Ojalá no me equivoque!

5

Si tiene una aplicación de Windows sin consola, puede crear una consola con la función AllocConsole. Una vez creado, puede escribir utilizando los métodos std :: cout normales.

+0

Creo que todavía tiene que redirigir los descriptores io para que funcione (como el ejemplo de guicon). O alternativamente simplemente use OutputDebugString en su lugar. – rogerdpack

4

La función de API de Windows AllocConsole creará una ventana de consola para su aplicación.

2

si se debe usar subsistema: consola o subsistema: ventanas tipo de depende de si la forma en que desea iniciar su aplicación:

  • Si utiliza el subsistema: consola , entonces obtienes todo el stdout escrito en la terminal. El problema es que si inicia la aplicación desde el Menú de inicio/Escritorio, usted (de forma predeterminada) obtiene una consola que aparece así como también la ventana de la aplicación (que puede verse bastante fea).
  • Si usa el subsistema: windows, no obtendrá stdout/stderr aunque ejecute la aplicación desde una ventana DOS, Cygwin u otro terminal.

Si desea que el camino del medio, que es a la salida de la terminal si la aplicación se inició en un terminal, a continuación, siga el enlace que Lucas proporciona en su solución (http://dslweb.nwnexus.com/~ast/dload/guicon.htm)

Como referencia, me encontré en este problema con una aplicación que quiero ejecutar en modo Windows normal o modo por lotes (es decir, como parte de un script) dependiendo de los modificadores de la línea de comandos. ¡La diferenciación total entre la consola y las aplicaciones de Windows es un poco extraña para la gente de Unix!

+1

Necesita cambiar un poco el ejemplo en el enlace: reemplace AllocConsole() con AttachConsole (ATTACH_PARENT_PROCESS) para enviarlo a la misma consola que inició la aplicación, si la aplicación se inició en una consola . Si no, esta función devolverá 0. – Ruud

0

Si usa MinGW, agregue una opción, -Wl,subsystem,console o -mconsole.

5

Para la depuración en Visual Studio se puede imprimir en la consola de depuración:

OutputDebugStringW(L"My output string."); 
Cuestiones relacionadas