Freigeben über


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

C++-iostreams sind zu formatierter Zeichenfolgenein- und -ausgabe fähig. Im folgenden Code wird das Festlegen von "cout" zum Formatieren einer ganzen Zahl für eine Hexadezimalausgabe dargestellt. Erst wird der aktuelle Zustand gespeichert, danach erfolgt das Zurücksetzen, da die Methode nach Übergabe der Zustandsformatierung an "cout" in dem Zustand verbleibt, bis sie geändert wird und nicht nur für 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
}

Dies kann vielen Fällen außerordentlich lästig sein. Alternativ können Sie "Boost.Format" aus den C++-Bibliotheken von Boost verwenden, obwohl das nicht dem Standard entspricht. Sie können jede Auftriebsbibliothek von der Website Boost herunterladen.

Einige Vorteile von "Boost.Format" sind:

  • Sicher: Typsicher und löst eine Ausnahme bei Fehlern aus, z. B. bei der Angabe von zu wenigen oder zu vielen Elementen

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

  • Bequem: Standard-Posix und ähnliche Formatzeichenfolgen

Obwohl "Boost.Format" auf C++-iostreams erstellt wird, die zwar sicher und erweiterbar sind, werden sie aber nicht leistungsoptimiert. Sofern Sie Leistungsoptimierung erfordern, sollten Sie C printf und sprintf berücksichtigen, deren Verwendung schnell und einfach ist. Allerdings sind sie nicht erweiterbar und können Sicherheitsrisiken bergen. (Sichere Versionen sind vorhanden, doch verursachen diese geringfügige Leistungseinbußen. 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

Referenz

<iostream>

<limits>

<iomanip>

Weitere Ressourcen

Willkommen zurück bei C++ (Modern C++)

C++-Sprachreferenz

C++-Standardbibliotheksreferenz