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?
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)
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.
Pour le débogage dans Visual Studio, vous pouvez imprimer sur la console de débogage:
OutputDebugStringW(L"My output string.");
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.
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++.
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;
}
La fonction API AllocConsole Windows créera une fenêtre de console pour votre application.
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!
Votre application doit être compilée en tant qu'application console Windows.
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 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!
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.
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).
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();
Si vous utilisez MinGW , ajoutez une option, -Wl,subsystem,console
ou -mconsole
.