Aracılığıyla paylaş


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 coutkaydeder. 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>