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>
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla