Sdílet prostřednictvím


Formátování řetězců a I/O (moderní verze jazyka C++)

Třídy, funkce a operátory iostream> jazyka C++ <podporují formátované vstupně-výstupní operace řetězců. Následující kód například ukazuje, jak nastavit cout formátování celého čísla na výstup v šestnáctkovém formátu. Nejprve uloží aktuální stav a resetuje ho poté, protože jakmile se stav formátu předá cout, zůstane tímto způsobem, dokud se nezmění. Nevztahuje se jenom na jeden řádek kódu.

#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
}

Tento přístup je bezpečný a rozšiřitelný, ale je také složitý a podrobný.

Možnosti alternativního formátu

Jako alternativu můžete použít Boost.Format knihovny Boost C++, i když je nestandardní. Libovolnou knihovnu Boost si můžete stáhnout z webu Boost .

Mezi výhody patří Boost.Format :

  • Sejf: Typově bezpečný a vyvolá výjimku pro chyby, například specifikace příliš málo nebo příliš mnoha položek.

  • Rozšiřitelné: Funguje pro libovolný typ, který lze streamovat.

  • Pohodlné: Standardní POSIX a podobné formátovací řetězce.

I když Boost.Format jsou založená na iostreamových> zařízeních C++<, která jsou bezpečná a rozšiřitelná, nejsou optimalizované pro výkon. Pokud vyžadujete optimalizaci výkonu, zvažte tisk asprintf jazyka C, které jsou rychlé a snadno použitelné. Nejsou však rozšiřitelné ani bezpečné před ohroženími zabezpečení. (Sejf verze existují, ale mají mírné snížení výkonu. Další informace najdete v tématu printf_s, _printf_s_l, wprintf_s, _wprintf_s_l a sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l).

Následující kód ukazuje některé z funkcí formátování Boost.

    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

Viz také

Vítejte zpátky v C++
Referenční dokumentace jazyka C++
Standardní knihovna C++
<iostream>
<Limity>
<iomanip>