Maison  >  Article  >  développement back-end  >  Comment rediriger C STDOUT vers une fonction définie par l'utilisateur ?

Comment rediriger C STDOUT vers une fonction définie par l'utilisateur ?

DDD
DDDoriginal
2024-11-01 01:04:02172parcourir

How to Redirect C   STDOUT to a User-Defined Function?

Redirection C STDOUT vers une fonction personnalisée

La redirection de la sortie standard vers un fichier est une pratique courante, mais que se passe-t-il si vous souhaitez le rediriger vers une fonction que vous définissez ?

Par exemple, considérons le cas hypothétique suivant :

<code class="cpp">void MyHandler(const char* data);

// <Magical redirection code>

printf("test");
std::cout << "test" << std::endl;

// MyHandler should have been called with "test" twice at this point</code>

Solution

Comme l'a souligné @Konrad Rudolph, rediriger stdout vers une fonction est possible en utilisant un ostringstream. Voici comment procéder :

<code class="cpp">// Redirect cout.
std::streambuf* oldCoutStreamBuf = std::cout.rdbuf();
std::ostringstream strCout;
std::cout.rdbuf(strCout.rdbuf());

// This goes to the string stream.
std::cout << "Hello, World!" << std::endl;

// Restore old cout.
std::cout.rdbuf(oldCoutStreamBuf);

// Will output our Hello World! from above.
std::cout << strCout.str();</code>

Bien que cette méthode fonctionne pour cout, cerr et clog, elle peut ne pas rediriger toutes les sorties standard pour des fonctions telles que printf, qui ciblent généralement à la fois les flux stdout et stderr.

Pour des données plus volumineuses, des techniques plus avancées telles que freopen(), setbuf(), dup() et dup2() peuvent être utilisées. Ces opérations nécessitent un peu plus de compréhension au niveau du système et peuvent impliquer la création de canaux ou la manipulation de descripteurs de fichiers.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn