Udostępnij za pośrednictwem


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

<iostream>

<limits>

<iomanip>

Inne zasoby

Zapraszamy ponownie do języka C++ (Modern C++)

Materiały referencyjne dotyczące języka C++

Odwołanie do standardowej biblioteki C++