Question

Lors de l'utilisation iostream en C ++ sous Linux, il affiche la sortie du programme dans le terminal, mais dans Windows, il enregistre simplement la sortie vers un fichier stdout.txt. Comment puis-je, sous Windows, faire apparaître la sortie dans la console?

Était-ce utile?

La solution

Puisque vous avez mentionné stdout.txt je google'd pour voir exactement ce qui créer un stdout.txt; normalement, même avec une application de Windows, la sortie de la console passe à la console allouée, ou nulle part si l'on est pas attribué.

Donc, en supposant que vous utilisez SDL (qui est la seule chose qui a fait monter stdout.txt), vous devez suivre les conseils ici . Soit stdout freopen et stderr avec « CON », ou faire l'autre éditeur de liens / compiler des solutions de contournement il.

Dans le cas où le lien à nouveau rompu obtient, voici exactement ce qui était de libSDL référencé:

  

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

     

« Je crois que dans le projet Visual C ++ qui est fourni avec SDL il y a une cible de SDL_nostdio> vous pouvez construire qui fait ce que vous voulez (TM). »

     

« Si vous définissez « NO_STDIO_REDIRECT » et recompiler SDL, je pense que cela va résoudre le problème. » >> (Réponse avec la permission de Bill Kendrick)

Autres conseils

Vous pouvez ajouter une console à une application non-console Windows en utilisant le processus décrit dans Ajout console d'E / S à une interface graphique Win32 App .

Il est un fil tout sur gamedev. net sur le sujet.

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

OutputDebugStringW(L"My output string.");

Si vous avez une application Windows ne console, vous pouvez créer une console avec AllocConsole fonction . Une fois créé, vous pouvez écrire à l'aide des méthodes normales std :: cout.

Tout d'abord, quel compilateur ou un environnement de dev vous utilisez? Si Visual Studio, vous devez faire un projet d'application de la console pour obtenir une sortie de la console.

En second lieu,

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

devrait travailler dans une application C ++ de la console.

Le AllocConsole fonction API Windows sera créer une fenêtre de console pour votre application.

Si vous utilisez la fonctionnalité Visual Studio vous devez modifier le propriété de projet : Propriétés de configuration -> Linker -> Système -.> SubSystem

Il doit être réglé sur: Console (/ SUBSYSTEM: CONSOLE)

Aussi, vous devriez changer votre WinMain être cette signature:

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

Si vous utilisez Visual Studio, il devrait fonctionner!

Voici un exemple de code:

#include <iostream>

using namespace std;

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

Assurez-vous que vous avez choisi une application console Win32 lors de la création d'un nouveau projet. vous pouvez toujours rediriger la sortie de votre projet à un fichier en utilisant le commutateur de console (>>). Cela fait rediriger le tuyau de la console loin de la sortie standard à votre dossier. (Par exemple, myprog.exe >> myfile.txt).

Je voudrais ne me trompe pas!

Que ce soit pour utiliser le sous-système: console ou sous-système: fenêtres dépend sorte de savoir si la façon dont vous voulez démarrer votre application:

  • Si vous utilisez le sous-système: console, vous obtenez tous les stdout écrit au terminal. Le problème est que si vous démarrez l'application à partir du menu Démarrer / Desktop, vous (par défaut) obtenir une console qui apparaît ainsi que la fenêtre d'application (qui peut sembler assez laid).
  • Si vous utilisez sous-système: Windows, vous n'obtiendrez stdout / stderr même si vous exécutez l'application à partir d'un Cygwin , ou tout autre terminal.

Si vous voulez la voie du milieu qui est à la sortie du terminal si l'application a été lancée dans un terminal, puis suivez le lien que Luc a fourni dans sa solution ( http://dslweb.nwnexus.com/~ast/dload/guicon.htm )

Pour référence, je suis tombé sur ce problème avec une application que je veux exécuter en mode de mode ou d'un lot normal de Windows (qui est, dans le cadre d'un script) en fonction des commutateurs de ligne de commande. La différenciation entre les applications de l'ensemble console et Windows est un peu bizarre pour les gens Unix!

Votre demande doit être compilé comme une application console Windows.

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

Vous ne devez pas nécessairement apporter des modifications à votre code (ni de changer le type de SUBSYSTEM). Si vous le souhaitez, vous aussi pouvez simplement pipe stdout et stderr à une application de la console (Windows version de cat fonctionne bien).

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

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();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top