Maison >développement back-end >C++ >Comment puis-je restaurer l'état d'origine de std::cout après avoir manipulé ses indicateurs de formatage ?

Comment puis-je restaurer l'état d'origine de std::cout après avoir manipulé ses indicateurs de formatage ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-07 00:49:13302parcourir

How Can I Restore the Original State of std::cout After Manipulating Its Formatting Flags?

Restauration de l'état std::cout après manipulation

En C, modification de l'état des flux d'E/S, tels que std::cout , peut avoir des conséquences inattendues sur les opérations ultérieures. Considérez l'extrait de 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..
}

Dans cet exemple, std::cout est modifié par la fonction printHex pour imprimer en hexadécimal. Cependant, cette modification persiste lors du retour à main, provoquant l'impression de la sortie ultérieure utilisant std::cout en hexadécimal au lieu de décimal.

Pour résoudre ce problème, nous devons restaurer l'état d'origine de std::cout une fois la fonction printHex terminée. Ceci peut être réalisé en utilisant la fonction membre flags de std::ios_base.

#include <ios>
#include <iostream>

int main(){
    std::ios_base::fmtflags f( std::cout.flags() );

    std::cout << 100; // prints 100 base 10
    printHex(std::cout); //prints 123 in hex

    std::cout.flags( f );

    std::cout << 73; //prints 73 base 10
}

En capturant les drapeaux actuels à l'aide de std::cout.flags() avant de le modifier, nous pouvons les restaurer en utilisant std:: cout.flags(f) pour réinitialiser l'état du flux à son format d'origine.

Cette technique permet de modifier temporairement les propriétés du flux d'E/S, garantissant que les flux ultérieurs Les opérations d'E/S sont effectuées comme prévu.

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