Dize ve G/Ç Biçimlendirme (Modern C++)
C++ <iostream> sınıfları, işlevleri ve işleçleri biçimlendirilmiş dize G/Ç'yi destekler. Örneğin, aşağıdaki kod bir tamsayıyı onaltılık olarak çıkış olarak biçimlendirmek için nasıl ayarlandığını cout
gösterir. İlk olarak, biçim durumu 'a geçirildikten sonra değiştirilene kadar bu şekilde kalacağından, geçerli durumu daha sonra sıfırlamak için cout
kaydeder. Yalnızca tek bir kod satırı için geçerli değildir.
#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
}
Bu yaklaşım tür açısından güvenli ve genişletilebilir olmakla birlikte karmaşık ve ayrıntılıdır.
Alternatif biçim seçenekleri
Alternatif olarak, standart olmasa bile Boost C++ kitaplıklarını kullanabilirsiniz Boost.Format
. Boost web sitesinden herhangi bir Boost kitaplığını indirebilirsiniz.
Bazı avantajları Boost.Format
şunlardır:
Güvenli: Tür açısından güvenlidir ve hatalar için bir özel durum oluşturur; örneğin, çok az veya çok fazla öğe belirtimi.
Genişletilebilir: Akışla aktarılabilen her tür için çalışır.
Kullanışlı: Standart POSIX ve benzer biçim dizeleri.
Güvenli ve genişletilebilir C++< iostream> tesislerinde oluşturulmuş olsa Boost.Format
da performans açısından iyileştirilmiş değildir. Performans iyileştirmesi gerektiğinde, hızlı ve kullanımı kolay olan C printf ve sprintf'i göz önünde bulundurun. Ancak, bunlar genişletilebilir veya güvenlik açıklarına karşı güvenli değildir. (Güvenli sürümler vardır, ancak bunlar hafif bir performans cezasına neden olur. Daha fazla bilgi için bkz. printf_s, _printf_s_l, wprintf_s, _wprintf_s_l ve sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l).
Aşağıdaki kod, Biçimlendirmeyi artırma özelliklerinden bazılarını gösterir.
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
Ayrıca bkz.
C++ 'a yeniden hoş geldiniz
C++ Dil Başvurusu
C++ Standart Kitaplığı
<iostream>
<Sınır -ları>
<iomanip>