Maison > développement back-end > C++ > Comment réinitialiser « std :: cout » à son état d'origine après des modifications de formatage ?

Comment réinitialiser « std :: cout » à son état d'origine après des modifications de formatage ?

DDD
Libérer: 2024-12-02 10:57:11
original
903 Les gens l'ont consulté

How to Reset `std::cout` to its Original State After Formatting Changes?

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..
}
Copier après la connexion

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 );
Copier après la connexion

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)
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal