Heim > Artikel > Backend-Entwicklung > Wie erstelle ich benutzerdefinierte Stream-Manipulatoren, die sich auf nachfolgende Ausgaben in C auswirken?
Benutzerdefinierte Stream-Manipulatoren zum Ändern nachfolgender Ausgaben in C
In C sind Stream-Manipulatoren leistungsstarke Werkzeuge zum Anpassen und Verbessern von Eingabe- und Ausgabevorgängen. Ein gängiger Manipulator ist std::hex, der das Format der nachfolgenden numerischen Ausgabe in Hexadezimal ändert.
Was aber, wenn Sie einen Manipulator benötigen, der nicht nur zusätzliche Elemente zum Stream hinzufügt, sondern auch die Werte von Elementen ändert? das kommt danach? In diesem Artikel wird untersucht, wie ein solcher Manipulator erstellt wird, und der Anwendungsfall wird anhand eines einfachen Beispiels demonstriert.
Benutzerdefinierte Manipulatoren mit Zustandsspeicherung
Um nachfolgende Elemente im Stream zu ändern, Sie müssen Statusinformationen speichern, die jedem Stream zugeordnet sind. Dies kann mit der Funktion ios_base::iword und einem von xalloc generierten Index erreicht werden.
inline int geti() { static int i = ios_base::xalloc(); return i; }
Mit diesem Mechanismus können Sie zwei Manipulatoren definieren: add_one und add_none. add_one setzt den gespeicherten Zustand auf 1, während add_none ihn auf 0 setzt.
ostream& add_one(ostream& os) { os.iword(geti()) = 1; return os; } ostream& add_none(ostream& os) { os.iword(geti()) = 0; return os; }
Anpassen der numerischen Ausgabe
Die numerische Ausgabe in C wird durch Facetten gehandhabt. Um das Verhalten der numerischen Ausgabe zu ändern, können Sie eine benutzerdefinierte Facette definieren. Hier erstellen wir eine benutzerdefinierte Facette namens my_num_put, die jeden numerischen Wert um den gespeicherten Statuswert erhöht.
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())); } };
Testen des Manipulators
Um den benutzerdefinierten Manipulator zu testen, Sie können den Ausgabestream mit der neuen Facette versehen und die Manipulatoren verwenden, um die numerische Ausgabe zu ändern.
int main() { // outputs: 11121011 cout.imbue(locale(locale(), new my_num_put)); cout << add_one << 10 << 11 << add_none << 10 << 11; }
In diesem Beispiel gibt der Ausgabestream die Zahlen 10, 11, 10 und 11 mit dem Wert aus Zu jeder der ersten beiden Zahlen wird 1 addiert, was 11, 12, 10 und 11 ergibt.
Das obige ist der detaillierte Inhalt vonWie erstelle ich benutzerdefinierte Stream-Manipulatoren, die sich auf nachfolgende Ausgaben in C auswirken?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!