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 explique 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 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& 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& 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 avec 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ée à chacun des deux premiers nombres, ce qui donnera 11, 12, 10 et 11.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3