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
Libérer: 2024-12-07 00:49:13
original
373 Les gens l'ont consulté

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

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

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 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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal