„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie erstelle ich benutzerdefinierte Stream-Manipulatoren, die sich auf nachfolgende Ausgaben in C++ auswirken?

Wie erstelle ich benutzerdefinierte Stream-Manipulatoren, die sich auf nachfolgende Ausgaben in C++ auswirken?

Veröffentlicht am 14.11.2024
Durchsuche:487

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

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 verarbeitet. 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, können Sie 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 aus, wobei zu jeder der ersten beiden Zahlen der Wert 1 hinzugefügt wird, was 11, 12, 10 und 11 ergibt.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3