Maison  >  Article  >  développement back-end  >  Comment créer des manipulateurs de flux personnalisés qui affectent les sorties ultérieures en C ?

Comment créer des manipulateurs de flux personnalisés qui affectent les sorties ultérieures en C ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-06 15:23:02425parcourir

How to Create Custom Stream Manipulators that Affect Subsequent Outputs in C  ?

Manipulateurs de flux personnalisés pour modifier la sortie ultérieure en C

En C, les manipulateurs de flux sont des outils puissants pour personnaliser et améliorer les opérations d'entrée et de sortie. Un manipulateur courant est std::hex, qui modifie le format de la sortie numérique suivante en hexadécimal.

Cependant, que se passe-t-il si vous avez besoin d'un manipulateur qui non seulement ajoute des éléments supplémentaires au flux, mais modifie également les valeurs des éléments qui vient après ? Cet article explore comment créer un tel manipulateur et démontre son cas d'utilisation avec un exemple simple.

Manipulateurs personnalisés avec stockage d'état

Pour modifier les éléments suivants sur le flux, vous devez stocker les informations d'état associées à chaque flux. Ceci peut être réalisé en utilisant la fonction ios_base::iword et un index généré par xalloc.

inline int geti() {
    static int i = ios_base::xalloc();
    return i;
}

Avec ce mécanisme en place, vous pouvez définir deux manipulateurs : add_one et add_none. add_one définit l'état stocké sur 1, tandis que add_none le définit sur 0.

ostream& add_one(ostream& os) { os.iword(geti()) = 1; return os; }
ostream& add_none(ostream& os) { os.iword(geti()) = 0; return os; }

Personnalisation de la sortie numérique

La sortie numérique en C est gérée par des facettes. Pour modifier le comportement de la sortie numérique, vous pouvez définir une facette personnalisée. Ici, nous créons une facette personnalisée appelée my_num_put qui incrémente chaque valeur numérique de la valeur d'état stockée.

struct my_num_put : num_put<char> {
    iter_type do_put(iter_type s, ios_base&amp; f, char_type fill, long v) const {
        return num_put<char>::do_put(s, f, fill, v + f.iword(geti()));
    }

    iter_type do_put(iter_type s, ios_base&amp; f, char_type fill, unsigned long v) const {
        return num_put<char>::do_put(s, f, fill, v + f.iword(geti()));
    }
};

Test du manipulateur

Pour tester le manipulateur personnalisé, vous pouvez imprégner le flux de sortie de la nouvelle facette et utiliser les manipulateurs pour modifier la sortie numérique.

int main() {
    // outputs: 11121011
    cout.imbue(locale(locale(), new my_num_put));
    cout << add_one << 10 << 11 << add_none << 10 << 11;
}

Dans cet exemple, le flux de sortie imprimera les nombres 10, 11, 10 et 11 avec la valeur 1 ajouté à chacun des deux premiers nombres, ce qui donne 11, 12, 10 et 11.

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