Comment restaurer l'état de std::cout après l'avoir manipulé
En C , manipuler l'état des flux de sortie tels que std : :cout permet des options de formatage polyvalentes. Cependant, il devient parfois nécessaire de restaurer l'état d'origine après avoir effectué ces modifications.
Considérez le code suivant :
void printHex(std::ostream& x){ x << std::hex << 123; } int main(){ std::cout << 100; // prints 100 base 10 printHex(std::cout); //prints 123 in hex std::cout << 73; //problem! prints 73 in hex.. }
Ici, après avoir appelé printHex, l'état de std::cout change en sortie hexadécimale. Par conséquent, les opérations d'impression ultérieures s'impriment également en hexadécimal, même si le programmeur ne souhaite pas ce comportement.
Pour résoudre ce problème, on peut utiliser la technique suivante :
#include <iostream> std::ios_base::fmtflags f( cout.flags() ); // Your code here... cout.flags( f );
Par en sauvegardant les drapeaux actuels (options de formatage) de std::cout dans la variable f avant d'effectuer toute manipulation, on peut restaurer l'état d'origine en replaçant les drapeaux sur f après le temps souhaité changements.
Alternativement, pour un code plus pratique et orienté objet, on peut utiliser RAII (Resource Acquisition Is Initialization) comme suit :
#include <iostream> struct FlagsSaver { FlagsSaver() : flags( cout.flags() ) {} ~FlagsSaver() { cout.flags( flags ); } private: std::ios_base::fmtflags flags; }; void printHex(std::ostream& x) { FlagsSaver saver; // RAII to restore flags x << std::hex << 123; } int main() { std::cout << 100; // prints 100 base 10 printHex(std::cout); //prints 123 in hex std::cout << 73; // prints 73 base 10 (original flags restored) }
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!