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
Další zdroje
C++ vás vítá zpět (moderní verze jazyka C++)