web-dev-qa-db-fra.com

Visual Studio - Comment puis-je voir la sortie cout dans une application non console?

Il semble plutôt fastidieux de sortir dans la fenêtre de débogage. Où puis-je trouver la sortie cout si j'écris une information non console?

Comme:

double i = a / b;
cout << b << endl;//I want to check out whether b is zero. It seems the output cannot be found anywhere.
25
CDT

Pour sortir une chaîne dans la console de débogage, utilisez OutputDebugStringA. Voir http://msdn.Microsoft.com/en-us/library/windows/desktop/aa363362%28v=vs.85%29.aspx

Pour afficher des valeurs de variable dans la console de débogage, à l'aide de std::ostringstream, envoie la chaîne à OutputDebugStringA.

Des instructions de sortie excessives entraîneront un ralentissement sévère du programme. Cependant, c'est une bonne technique pour attraper des choses avec lesquelles le débogueur a un problème, comme les membres enfants réels lors de la lecture avec des pointeurs de base.

10
Thomas Matthews

La question est très claire. Comment utiliser std :: cout pour déboguer une application non console dans Visual Studio.

La réponse est très claire: vous ne pouvez pas. Autrement dit, Visual Studio ne prend pas en charge std :: cout comme outil de débogage pour les applications non console.

Il s'agit d'une sérieuse limitation de Visual Studio, probablement un échec à respecter même la norme C++. Je trouve très triste de voir ici des "réponses" désinformatives qui tentent de cacher ce défaut de leur précieux Visual Studio.

87
Marius Amado-Alves

Pour une solution Windows, vous pouvez allouer une console et y associer cout/cin. Par exemple:

AllocConsole();
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);  

Documentation:
https://msdn.Microsoft.com/en-us/library/windows/desktop/ms681944%28v=vs.85%29.aspx

27
Trevor Hickey

SOLUTION: cette réponse résout la question et vous permet de rediriger la sortie de la console vers la fenêtre de sortie de Visual Studio. Nous avons d'abord besoin d'une classe qui remplace le flux de chaînes cout par défaut:

class dbg_stream_for_cout
    : public std::stringbuf
{
public:
    ~dbg_stream_for_cout() { sync(); }
    int sync()
    {
        ::OutputDebugStringA(str().c_str());
        str(std::string()); // Clear the string buffer
        return 0;
    }
};
dbg_stream_for_cout g_DebugStreamFor_cout;

Ensuite, quelque part où vous voulez "activer" l'écriture dans la fenêtre de sortie VS:

std::cout.rdbuf(&g_DebugStreamFor_cout); // Redirect std::cout to OutputDebugString!
9
Luc Bloom

Au lieu d'utiliser cout, créez un fichier journal et écrivez-y tout ce que vous voulez.

Modifier: utilisez ce code simple pour écrire dans un fichier journal.

ofstream log;
log.open ("log.txt");
log << "Writing this to a file.\n";
log.close();
3
AliBZ

Utilisez simplement std :: cin.get () à la fin de votre code, par exemple:

std::cout << "print this" << std::endl;
std::cin.get();

Cela force le programme à rester ouvert et à attendre la saisie de l'utilisateur.

Fonctionne pour moi de toute façon. Nous remercions TheChernoProject: https://www.youtube.com/channel/UCQ-W1KE9EYfdxhL6S4twUNw

2
Beko

Je voudrais donner mes 2 cents.

Étant donné que le problème est peut-être un problème de conformité avec la norme C++ ou que nous pourrions utiliser OutputDebugStringA, si vous ne pouvez pas modifier votre base de code, vous aimerez peut-être simplement rediriger std :: cout vers autre chose, comme un fichier.

Donc, sans changer votre base de code, vous pouvez faire quelque chose comme suggéré ici: Comment rediriger cin et cout vers des fichiers?

Condensé:

  • ajoutez l'inclusion #include <fstream>
  • au début de votre application, dans certains init, avant de vous connecter, vous pouvez utiliser:
std::ofstream out("out.txt");
std::streambuf *coutbuf = std::cout.rdbuf(); //save old buf
std::cout.rdbuf(out.rdbuf()); //redirect std::cout to out.txt!
  • à la fin de votre application/journalisation:

std :: cout.rdbuf (coutbuf); // réinitialiser à nouveau la sortie standard

J'espère que cela peut aider quelqu'un, bravo à Nawaz qui a fourni la réponse dans l'autre fil.

2
Stefano Buora