Sdílet prostřednictvím


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

Třídy typu iostream v C++ jsou schopny vstupu a výstupu formátovaných řetězců.Například následující kód ukazuje, jak nastavit cout k formátování výstupu celého čísla v šestnáctkové soustavě, nejprve uložením mimo aktuální stav a opětovným nastavením později, protože formátování stavu po předání cout zůstane tak, jak je, dokud není změněno, a nikoli pouze pro 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
}

To může být v mnoha případech příliš obtížné.Jako alternativu můžete použít metodu Boost.Format z knihoven Boost C++, přestože je nestandardní.Všechny knihovny Boost můžete stáhnout z webu Boost.

Některé výhody Boost.Format jsou:

  • Bezpečnost: Typově bezpečné a vrací chybovou výjimku – například specifikace obsahují příliš málo nebo příliš mnoho položek.

  • Rozšiřitelné: Funguje pro libovolný typ, který může být přenášen pomocí proudu.

  • Pohodlné: Standard Posix a podobné formátovací řetězce.

I když je Boost.Format založen na knihovnách C++ iostreams, které jsou bezpečné a rozšiřitelné, nejsou optimalizovány pro výkon.Pokud požadujete optimalizaci výkonu, zvažte v jazyku C možnost printf a sprintf, které jsou rychlé a snadno ovladatelné.Nejsou však rozšiřitelné nebo bezpečné před chybami zabezpečení. (Existují bezpečné verze, ale způsobují mírné snížení výkonu.Další informace naleznete 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é funkce 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é

Referenční dokumentace

<iostream>

<limits>

<iomanip>

Další zdroje

C++ vás vítá zpět (moderní verze jazyka C++)

Referenční dokumentace jazyka C++

Standardní knihovna C++ – referenční dokumentace