Maison > développement back-end > C++ > Comment puis-je restaurer l'état d'origine de « std :: cout » après qu'une fonction ait modifié ses indicateurs de formatage ?

Comment puis-je restaurer l'état d'origine de « std :: cout » après qu'une fonction ait modifié ses indicateurs de formatage ?

Patricia Arquette
Libérer: 2024-12-06 22:17:15
original
147 Les gens l'ont consulté

How Can I Restore the Original State of `std::cout` After a Function Modifies Its Formatting Flags?

Reprendre le contrôle : restaurer l'intégrité de std::cout

Question :

Dans un scénario où une fonction, appelons-le printHex, modifie l'état de std::cout (par exemple, base, largeur de champ, etc.), comment restaurer l'état d'origine après l'invocation de la fonction ? Ce problème survient lorsque la sortie ultérieure utilisant std::cout est corrompue par les changements d'état effectués dans printHex.

Réponse :

Pour reprendre le contrôle de std::cout et rétablissez-le à ses paramètres d'origine, nous pouvons utiliser les capacités du en-tête (ou en-tête ). Ce processus de restauration implique deux étapes clés :

  1. Capturez l'état actuel : À l'aide de std::ios_base::fmtflags f(cout.flags()), récupérez les indicateurs de formatage actuels et stockez-les dans une variable nommée f. Cela capture l'état de std::cout avant qu'il puisse être modifié par printHex.
  2. Restaurer l'état d'origine : Une fois que printHex a terminé sa tâche, nous pouvons restaurer les paramètres d'origine de std ::cout en appelant cout.flags(f). Cette action réinitialise std::cout à l'état qu'il avait avant l'appel de fonction, garantissant que les opérations de sortie ultérieures fonctionnent comme prévu.

Alternativement, nous pouvons implémenter le processus de restauration à l'aide de l'acquisition de ressources est l'initialisation. (RAII) pour gérer automatiquement les drapeaux. Voici un exemple :

class RestoreCoutFlags {
public:
    RestoreCoutFlags(std::ostream& stream)
        : _savedFlags(stream.flags()) {}

    ~RestoreCoutFlags() {
        stream.flags(_savedFlags);
    }

    operator std::streambuf*() const {
        return stream.rdbuf();
    }

private:
    std::ios_base::fmtflags _savedFlags;
};
Copier après la connexion

Avec cette classe, la restauration peut être réalisée de la manière suivante :

{
    RestoreCoutFlags r(std::cout);

    // Code that modifies std::cout flags

} // When the block exits, r is automatically destroyed, restoring the flags.
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
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