Udostępnij za pośrednictwem


Formatowanie ciągów i we/wy (Modern C++)

Klasy iostream> języka C++<, funkcje i operatory obsługują sformatowane we/wy ciągów. Na przykład poniższy kod pokazuje, jak ustawić cout format liczby całkowitej na dane wyjściowe w szesnastkowym. Najpierw zapisuje bieżący stan, aby zresetować go później, ponieważ po przekazaniu stanu formatu do cout, pozostaje w ten sposób do czasu zmiany. Nie dotyczy to tylko jednego wiersza 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
}

Takie podejście jest bezpieczne i rozszerzalne, ale jest również złożone i pełne.

Opcje formatu alternatywnego

Alternatywnie można użyć z Boost.Format bibliotek Boost C++, mimo że jest to niezgodne z normą. Możesz pobrać dowolną bibliotekę Boost z witryny internetowej Boost .

Oto kilka Boost.Format zalet:

  • Sejf: Bezpieczne typ i zgłasza wyjątek dla błędów, na przykład specyfikację zbyt mało lub zbyt wiele elementów.

  • Rozszerzalne: działa w przypadku dowolnego typu, który można przesyłać strumieniowo.

  • Wygodne: Standardowe poSIX i podobne ciągi formatu.

Mimo że Boost.Format jest oparty na obiektach iostream> języka C++<, które są bezpieczne i rozszerzalne, nie są zoptymalizowane pod kątem wydajności. Jeśli potrzebujesz optymalizacji wydajności, rozważ użycie narzędzia C printf i sprintf, które są szybkie i łatwe w użyciu. Nie są one jednak rozszerzalne ani bezpieczne przed lukami w zabezpieczeniach. (Sejf istnieją wersje, ale powodują niewielkie kary za wydajność. 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 przedstawia niektóre funkcje formatowania 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

Zobacz też

Witamy z powrotem w języku C++
Dokumentacja języka C++
Standardowa biblioteka C++
<Iostream>
<Limity>
<iomanip>