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!