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
Patricia Arquetteoriginal
2024-12-06 22:17:15149parcourir

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;
};

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.

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