Heim > Backend-Entwicklung > C++ > 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?

Linda Hamilton
Freigeben: 2024-11-06 15:23:02
Original
510 Leute haben es durchsucht

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;
}
Nach dem Login kopieren

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; }
Nach dem Login kopieren

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&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()));
    }
};
Nach dem Login kopieren

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;
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage