Maison > développement back-end > C++ > Comment pouvez-vous créer un manipulateur de flux C personnalisé pour modifier les éléments de flux suivants ?

Comment pouvez-vous créer un manipulateur de flux C personnalisé pour modifier les éléments de flux suivants ?

Mary-Kate Olsen
Libérer: 2024-11-07 10:38:03
original
633 Les gens l'ont consulté

How Can You Create a Custom C   Stream Manipulator to Modify Subsequent Stream Items?

Manipulateur de flux C personnalisé pour modifier les éléments de flux suivants

En C, le manipulateur hexadécimal peut être utilisé pour convertir un nombre en sa représentation hexadécimale . Cependant, que se passe-t-il si vous devez modifier non seulement l'élément actuel, mais également les éléments suivants du flux ?

Créer le manipulateur plusone

Pour créer un manipulateur qui incrémente le prochaine valeur numérique sur le flux, suivez ces étapes :

1. Stocker l'état sur chaque flux :

Utilisez iword et geti() pour stocker l'état sur chaque flux.

inline int geti() { 
    static int i = ios_base::xalloc();
    return i;
}
Copier après la connexion

2. Définir les fonctions du manipulateur :

Créer des fonctions pour définir et désactiver l'état stocké.

ostream& add_one(ostream& os) { os.iword(geti()) = 1; return os; } 
ostream& add_none(ostream& os) { os.iword(geti()) = 0; return os; }
Copier après la connexion

3. Intercepter la sortie numérique :

Créez une facette my_num_put pour intercepter la sortie numérique et appliquer l'incrément stocké.

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

4. Testez le manipulateur :

Utilisez les manipulateurs pour incrémenter la valeur numérique suivante et affichez les résultats.

int main() {
    // outputs: 11121011
    cout.imbue(locale(locale(),new my_num_put));
    cout << add_one << 10 << 11 
         << add_none << 10 << 11;
}
Copier après la connexion

Réinitialiser l'incrément à usage unique :

Si vous souhaitez incrémenter uniquement le numéro suivant, réinitialisez l'état stocké après chaque appel à do_put.

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