Ekleme İşleçlerini Kullanma ve Biçimi Denetleme

Bu konuda, biçimi denetleme ve kendi sınıflarınız için ekleme işleçleri oluşturma işlemleri gösterilmektedir. Tüm standart C++ veri türleri için önceden programlanmış ekleme (<<) işleci, bir çıkış akışı nesnesine bayt gönderir. Ekleme işleçleri, tamsayı bağımsız değişkenlerinin varsayılan biçimini değiştiren öğeler olan önceden tanımlanmış "manipülatörler" ile çalışır.

Biçimi aşağıdaki seçeneklerle denetleyebilirsiniz:

Çıkış Genişliği

Çıkışı hizalamak için, manipülatörü akışa yerleştirerek setw veya üye işlevini çağırarak width her öğenin çıkış genişliğini belirtirsiniz. Bu örnek, sütundaki değerleri en az 10 karakter genişliğinde sağa hizalar:

// output_width.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

int main( )
{
   double values[] = { 1.23, 35.36, 653.7, 4358.24 };
   for( int i = 0; i < 4; i++ )
   {
      cout.width(10);
      cout << values[i] << '\n';
   }
}
      1.23
     35.36
     653.7
   4358.24

Baştaki boşluklar, 10 karakterden daha kısa bir değere eklenir.

Bir alanı doldurmak için, belirtilen genişliğe sahip alanlar için doldurma karakterinin değerini ayarlayan üye işlevini kullanın fill . Varsayılan değer boş değerdir. Sayı sütununu yıldız işaretiyle doldurmak için önceki for döngüde aşağıdaki gibi değişiklik yapın:

for (int i = 0; i <4; i++)
{
    cout.width(10);
    cout.fill('*');
    cout << values[i] << endl;
}

Manipülatör endl yeni satır karakterinin ('\n') yerini alır. Çıkış şuna benzer:

******1.23
*****35.36
*****653.7
***4358.24

Aynı satırdaki veri öğelerinin genişliklerini belirtmek için manipülatörü setw kullanın:

// setw.cpp
// compile with: /EHsc
#include <iostream>
#include <iomanip>
using namespace std;

int main( )
{
   double values[] = { 1.23, 35.36, 653.7, 4358.24 };
   const char *names[] = { "Zoot", "Jimmy", "Al", "Stan" };
   for( int i = 0; i < 4; i++ )
      cout << setw( 7 )  << names[i]
           << setw( 10 ) << values[i] << endl;
}

width Üye işlevi içinde <iostream>bildirilir. bağımsız değişkenlerle veya başka bir manipülatör kullanıyorsanız setw , eklemeniz <iomanip>gerekir. Çıktıda dizeler 7 genişlikli bir alanda, tamsayılar ise 10 genişlikli bir alanda yazdırılır:

   Zoot      1.23
  Jimmy     35.36
     Al     653.7
   Stan   4358.24

setw ve width değerleri kesmeyin. Biçimlendirilmiş çıkış genişliği aşarsa, akışın duyarlık ayarına bağlı olarak değerin tamamı yazdırılır. setw Hem hem de width yalnızca aşağıdaki alanı etkiler. Alan genişliği, bir alan yazdırıldıktan sonra varsayılan davranışına (gerekli genişlik) geri döner. Ancak, diğer akış biçimi seçenekleri değiştirilene kadar etkin kalır.

Hizalama

Çıkış akışları varsayılan olarak sağa hizalanmış metindir. Önceki örnekteki adları sola hizalamak ve sayıları sağa hizalamak için döngünün for yerine aşağıdaki gibi yazın:

for (int i = 0; i <4; i++)
    cout << setiosflags(ios::left)
         << setw(6) << names[i]
         << resetiosflags(ios::left)
         << setw(10) << values[i] << endl;

Çıkış şuna benzer:

Zoot        1.23
Jimmy      35.36
Al         653.7
Stan     4358.24

Sola hizala bayrağı, numaralandırıcı ile setiosflagsleft birlikte manipülatör kullanılarak ayarlanır. Bu numaralandırıcı sınıfında tanımlanır ios , bu nedenle başvurusu ön ekini ios:: içermelidir. Manipülatör resetiosflags sola hizala bayrağını kapatır. ve'in widthaksine setw ve'nin setiosflagsresetiosflags etkisi kalıcıdır.

Duyarlık

Kayan nokta duyarlık için varsayılan değer altıdır. Örneğin, 3466,9768 sayısı 3466,98 olarak yazdırılır. Bu değerin yazdırılma biçimini değiştirmek için manipülatör kullanın setprecision . Manipülatörde iki bayrak vardır: fixed ve scientific. Ayarlanırsa fixed , sayı 3466.976800 olarak yazdırılır. Ayarlanırsa scientific , 3,4669773+003 olarak yazdırılır.

Önemli bir basamakla hizalama bölümünde gösterilen kayan noktalı sayıları görüntülemek için döngünün for yerine aşağıdaki gibi yazın:

for (int i = 0; i <4; i++)
    cout << setiosflags(ios::left)
         << setw(6)
         << names[i]
         << resetiosflags(ios::left)
         << setw(10)
         << setprecision(1)
         << values[i]
         << endl;

Program bu listeyi yazdırır:

Zoot          1
Jimmy     4e+01
Al        7e+02
Stan      4e+03

Bilimsel gösterimi ortadan kaldırmak için döngüden for önce şu deyimi ekleyin:

cout << setiosflags(ios::fixed);

Sabit gösterimiyle, program ondalık ayırıcıdan sonra bir basamakla yazdırılır.

Zoot         1.2
Jimmy       35.4
Al         653.7
Stan      4358.2

bayrağını ios::fixed olarak ios::scientificdeğiştirirseniz, program şunu yazdırır:

Zoot    1.2e+00
Jimmy   3.5e+01
Al      6.5e+02
Stan    4.4e+03

Yine, program ondalık ayırıcıdan sonra bir basamak yazdırır. ios::fixed Veya ios::scientific ayarlandıysa, duyarlık değeri ondalık ayırıcıdan sonraki basamak sayısını belirler. İki bayrak da ayarlı değilse, duyarlık değeri önemli basamakların toplam sayısını belirler. Manipülatör resetiosflags bu bayrakları temizler.

Kök

dec, octve hex manipülatörleri, giriş ve çıkış için varsayılan radyeli ayarlar. Örneğin, manipülatörü hex çıkış akışına eklerseniz, nesne tamsayıların iç veri gösterimini doğru bir şekilde onaltılık çıkış biçimine çevirir. Bayrak açıksa uppercase (varsayılan) sayılar küçük harfle a ile f arasında basamaklarla görüntülenir; aksi takdirde büyük harfle görüntülenirler. Varsayılan sayı tabanı ( dec ondalık).

Tırnak içine alınmış dizeler (C++14)

Bir akışa dize eklediğinizde, üye işlevini çağırarak aynı dizeyi stringstream::str() kolayca geri alabilirsiniz. Ancak, daha sonraki bir noktada akışı yeni bir dizeye eklemek için ayıklama işlecini kullanmak istiyorsanız, ilk boşluk karakterini bulduğunda işleç varsayılan olarak duracağından beklenmeyen bir sonuç >> alabilirsiniz.

std::stringstream ss;
std::string inserted = "This is a sentence.";
std::string extracted;

ss << inserted;
ss >> extracted;

std::cout << inserted;     //  This is a sentence.
std::cout << extracted;    //  This

Bu davranışın üstesinden el ile gelinebilir, ancak dizenin yuvarlamasını daha kullanışlı hale getirmek için C++14, 'ye std::quotedakış manipülatörü <iomanip> ekler. Ekleme işleminden sonra dizeyi quoted() bir sınırlayıcı (varsayılan olarak çift tırnak ' ' ' ' ) ile çevreler ve ayıklama sonrasında, son sınırlayıcı bulunana kadar akışı işleyerek tüm karakterleri ayıklar. Eklenmiş tırnak işaretleri kaçış karakteriyle (varsayılan olarak '\\') kaçış karakteriyle kaçış karakteriyle birlikte çıkarılır.

Sınırlayıcılar yalnızca akış nesnesinde bulunur; ayıklanan dizede yoktur, ancak tarafından basic_stringstream::strdöndürülen dizede bulunurlar.

Ekleme ve ayıklama işlemlerinin boşluk davranışı, bir dizenin kodda nasıl temsil edildiklerinden bağımsızdır, bu nedenle giriş dizesinin ham dize değişmez değeri mi yoksa normal bir dize mi olduğuna bakılmaksızın tırnak içine alınan işleç yararlıdır. Giriş dizesinin biçimi ne olursa olsun, eklenmiş tırnak işaretleri, satır sonları, sekmeler vb. olabilir ve tüm bunlar manipülatör tarafından quoted() korunur.

Daha fazla bilgi ve tam kod örnekleri için bkz quoted. .

Ayrıca bkz.

Çıkış Akışları