Freigeben über


Formatieren von Zeichenfolgen und Ein-/Ausgaben (Modern C++)

C++ <-Iostream-Klassen> , -Funktionen und -Operatoren unterstützen formatierte Zeichenfolgen-E/A. Der folgende Code zeigt beispielsweise, wie eine ganze Zahl so formatiert cout wird, dass sie in hexadezimal ausgegeben wird. Zuerst speichert er den aktuellen Zustand, um ihn anschließend zurückzusetzen, da der Formatzustand nach dem Übergeben an coutden Formatzustand so bleibt, bis er geändert wurde. Sie gilt nicht nur für die eine Codezeile.

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    ios state(nullptr);

    cout << "The answer in decimal is: " << 42 << endl;

    state.copyfmt(cout); // save current formatting
    cout << "In hex: 0x" // now load up a bunch of formatting modifiers
        << hex
        << uppercase
        << setw(8)
        << setfill('0')
        << 42            // the actual value we wanted to print out
        << endl;
    cout.copyfmt(state); // restore previous formatting
}

Dieser Ansatz ist typsicher und erweiterbar, aber es ist auch komplex und ausführlich.

Alternative Formatoptionen

Alternativ können Sie aus den Boost C++-Bibliotheken verwenden Boost.Format , obwohl sie nicht standardmäßig ist. Sie können jede Boost-Bibliothek von der Boost-Website herunterladen.

Einige Vorteile sind Boost.Format :

  • Tresor: Typsicher und löst eine Ausnahme für Fehler aus, z. B. die Spezifikation von zu wenigen oder zu vielen Elementen.

  • Erweiterbar: Funktioniert für jeden Typ, der gestreamt werden kann

  • Praktisch: Standard POSIX und ähnliche Formatzeichenfolgen.

Obwohl Boost.Format sie auf C++ <-Iostream-Einrichtungen> basieren, die sicher und erweiterbar sind, sind sie nicht leistungsoptimiert. Wenn Sie Leistungsoptimierung benötigen, ziehen Sie C printf und Sprintf in Betracht, die schnell und einfach zu bedienen sind. Sie sind jedoch nicht erweiterbar oder vor Sicherheitsrisiken sicher. (Tresor Versionen sind vorhanden, aber sie verursachen eine leichte Leistungseinbuße. Weitere Informationen finden Sie unter printf_s, _printf_s_l, wprintf_s, _wprintf_s_l und sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l).

Im folgenden Code werden einige der Boost-Formatierungsfunktionen verdeutlicht.

    string s = str( format("%2% %2% %1%\n") % "world" % "hello" );
    // s contains "hello hello world"

    for( auto i = 0; i < names.size(); ++i )
        cout << format("%1% %2% %|40t|%3%\n") % first[i] % last[i] % tel[i];
    // Georges Benjamin Clemenceau             +33 (0) 123 456 789
    // Jean de Lattre de Tassigny              +33 (0) 987 654 321

Siehe auch

Willkommen zurück bei C++
C++-Programmiersprachenreferenz
C++-Standardbibliothek
<iostream>
<limits>
<iomanip>