Formatowanie ciągów i we/wy (Modern C++)
C++ iostreams są w stanie sformatować ciąg we/wy.Na przykład poniższy kod pokazuje, jak ustawić licznik w celu sformatowania liczby całkowitej w taki sposób, by dane wyjściowe były w formacie szesnastkowym, najpierw zapisując stan bieżący, a następnie resetując go, ponieważ jeśli stan formatowania zostanie przekazany do licznika, pozostaje niezmienny do wprowadzenia zmiany, nie tylko dla jednej linii kodu.
#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
}
Może to być w wielu przypadkach zbyt kłopotliwe.Alternatywnie można użyć bibliotek Boost.Format C++ , nawet jeśli nie jest to standardowe.Możesz pobrać każdą bibliotekę Boost z witryny internetowej Boost.
Niektóre zalety Boost.Format:
Bezpieczny: typ bezpieczny i zgłasza wyjątek dla błędów — na przykład specyfikacja o zbyt małej lub zbyt dużej liczbie elementów.
Rozszerzalne: działa z każdym typem, który może być przesyłany strumieniowo.
Wygoda: Standard Posix i podobne ciągi formatów.
Chociaż Boost.Format jest zbudowany na C++ iostreams, które są bezpieczne i rozszerzalne, nie są zoptymalizowane pod kątem wydajności.Kiedy chcesz przeprowadzić optymalizację wydajności, rozważ C printf i sprintf, które są szybkie i łatwe w użyciu.Jednak nie są one rozszerzalne ani pozbawione luk. (Istnieją wersje bezpieczne, ale one powoduje niewielką karę wydajności.Aby uzyskać więcej informacji, zobacz printf_s, _printf_s_l, wprintf_s, _wprintf_s_l i sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l).
Poniższy kod ilustruje część zwiększenia funkcji formatowania.
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
Zobacz też
Informacje
Inne zasoby
Zapraszamy ponownie do języka C++ (Modern C++)