web-dev-qa-db-fra.com

Comment sortir vers la console en C++/Windows

Lorsque vous utilisez iostream en C++ sous Linux, la sortie du programme est affichée dans le terminal, mais sous Windows, elle enregistre simplement la sortie dans un fichier stdout.txt. Comment puis-je, dans Windows, faire apparaître le résultat dans la console?

14
Xunil

Depuis que vous avez mentionné stdout.txt, j'ai consulté Google pour voir ce qui créerait exactement un stdout.txt; normalement, même avec une application Windows, la sortie de la console va à la console allouée, ou nulle part si aucune n’est allouée.

Donc, en supposant que vous utilisez SDL (qui est la seule chose qui a amené stdout.txt), vous devriez suivre le conseil ici . Soit freopen stdout et stderr avec "CON", soit utilisez l’autre lieur/compilez les solutions de contournement.

Au cas où le lien serait à nouveau brisé, voici exactement ce qui a été référencé depuis libSDL: 

Comment éviter de créer stdout.txt et stderr.txt?

"Je crois que dans le projet Visual C++ fourni avec SDL, il existe une cible SDL_nostdio> que vous pouvez créer, qui fait ce que vous voulez (TM)."

"Si vous définissez" NO_STDIO_REDIRECT "et recompilez SDL, je pense que cela résoudra le problème." >> (Réponse fournie par Bill Kendrick)

16
MSN

Vous pouvez ajouter une console à une application non-Windows utilisant la procédure décrite dans Ajout d'E/S de console à une application d'interface graphique Win32.

Il y a un fil entier sur gamedev.net sur le sujet.

13
luke

Pour le débogage dans Visual Studio, vous pouvez imprimer sur la console de débogage:

OutputDebugStringW(L"My output string.");
7
Sean

Si vous avez une application Windows sans console, vous pouvez créer une console avec la fonction AllocConsole . Une fois créé, vous pouvez y écrire en utilisant les méthodes normales std :: cout. 

5
anon

Tout d’abord, quel compilateur ou environnement dev utilisez-vous? Si Visual Studio, vous devez créer un projet d'application console pour obtenir une sortie de console.

Seconde,

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

devrait fonctionner dans n'importe quelle application de la console C++.

4
crashmstr

Si vous utilisez Visual Studio, vous devez modifier la propriété project: Propriétés de configuration -> Linker -> Système -> Sous-système.

Ceci doit être défini sur: Console (/ SUBSYSTEM: CONSOLE)

Aussi, vous devriez changer votre WinMain pour qu'il soit cette signature:

int main(int argc, char **argv)
{
    //...
    return 0;
}
4
Brian R. Bondy

La fonction API AllocConsole Windows créera une fenêtre de console pour votre application.

4
jeffm

Si vous utilisez Visual Studio, cela devrait fonctionner correctement!

Voici un exemple de code:

#include <iostream>

using namespace std;

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

Assurez-vous d'avoir choisi une application console Win32 lors de la création d'un nouveau projet. Vous pouvez néanmoins rediriger la sortie de votre projet vers un fichier à l’aide du commutateur de console (>>). Cela détournera effectivement le tuyau de la console de la sortie standard vers votre fichier. (par exemple, myprog.exe >> myfile.txt).

Je souhaite que je ne me trompe pas!

3
Galilyou

Votre application doit être compilée en tant qu'application console Windows.

2
spoulson

Que vous utilisiez sous-système: console ou sous-système: Windows dépend de la manière dont vous souhaitez démarrer votre application:

  • Si vous utilisez subsystem: console, tous les éléments stdout sont écrits sur le terminal. Le problème, c'est que si vous démarrez l'application à partir du menu Démarrer/Bureau, vous obtenez (par défaut) une console ainsi que la fenêtre de l'application (qui peut paraître très moche).
  • Si vous utilisez subsystem: windows, vous n'obtiendrez pas stdout/stderr même si vous exécutez l'application à partir d'un DOS fenêtre, Cygwin ou d'un autre terminal.

Si vous voulez la voie médiane qui consiste à sortir vers le terminal SI l'application a été lancée dans un terminal, suivez le lien fourni par Luke dans sa solution ( http://dslweb.nwnexus.com/~ast/dload/ guicon.htm )

Pour référence, j'ai rencontré ce problème avec une application que je souhaite exécuter en mode Windows normal ou en mode de traitement par lots (c'est-à-dire dans le cadre d'un script) en fonction des commutateurs de ligne de commande. Toute la différence entre la console et les applications Windows est un peu bizarre pour les gens d'Unix!

2
AJ.

Je suppose que vous utilisez une version de Visual Studio? Dans Windows, std::cout << "something"; doit écrire quelque chose dans une fenêtre de console SI votre programme est configuré dans les paramètres du projet en tant que programme console.

1
Rob K

Vous n'avez pas nécessairement besoin de modifier votre code (ni de changer le type SUBSYSTEM). Si vous le souhaitez, vous pouvez également simplement pipe stdout et stderr vers une application console (une version Windows de cat fonctionne bien).

0
jamesdlin

Il y a une bonne solution

if (AllocConsole() == 0)
{
    // Handle error here. Use ::GetLastError() to get the error.
}

// Redirect CRT standard input, output and error handles to the console window.
FILE * pNewStdout = nullptr;
FILE * pNewStderr = nullptr;
FILE * pNewStdin = nullptr;

::freopen_s(&pNewStdout, "CONOUT$", "w", stdout);
::freopen_s(&pNewStderr, "CONOUT$", "w", stderr);
::freopen_s(&pNewStdin, "CONIN$", "r", stdin);

// Clear the error state for all of the C++ standard streams. Attempting to accessing the streams before they refer
// to a valid target causes the stream to enter an error state. Clearing the error state will fix this problem,
// which seems to occur in newer version of Visual Studio even when the console has not been read from or written
// to yet.
std::cout.clear();
std::cerr.clear();
std::cin.clear();

std::wcout.clear();
std::wcerr.clear();
std::wcin.clear();
0
YuryChu

Si vous utilisez MinGW , ajoutez une option, -Wl,subsystem,console ou -mconsole.

0
Jarekczek