01
08
Çıktının Yeni Bir Yolu
![Program kodu](/f/ce96b2abce7c2de477b070bb16b55e3b.jpg)
C ++, C ile çok yüksek geriye dönük uyumluluğu korur,
Önceki derste bu, cout kullanılan bir örnekle ele alındı. Burada, girdiden daha çok kullanılma eğiliminde olduğundan, önce çıktıdan başlayarak biraz daha derinliğe gideceğiz.
İostream sınıfı, hem çıktı hem de girdi için gereken nesnelere ve yöntemlere erişim sağlar. G / Ç'yi, uygulamanızdan bir dosyaya, ekrana veya yazıcıya - çıktı olan veya klavyeden - girilen bayt akışları açısından düşünün.
Cout ile Çıktı
C'yi biliyorsanız, bunu biliyor olabilirsiniz << bitleri sola kaydırmak için kullanılır. Örneğin, 3 << 3 24'tür. Örneğin sola kaydırma değeri ikiye katlar, böylece 3 sola kaydırma 8 ile çarpar.
C ++ 'da, << oldu aşırı ostream sınıfında ki int, şamandırave dizeler türleri (ve bunların varyantları - ör. çiftler) desteklenmektedir. << arasında birden çok öğeyi bir araya getirerek metin çıktısını bu şekilde yaparsınız.
cout << "Bazı Metinler" << intvalue << floatdouble << endl;
Bu tuhaf sözdizimi mümkündür çünkü << aslında bir işlev çağrısı referans bir ostream'e nesne. Yani yukarıdaki gibi bir çizgi aslında böyle
cout. << ("bazı metin"). cout. << (değer) .cout. << (floatdouble) .cout. << (endl);
C fonksiyonprintf % d gibi Biçim Belirticileri kullanarak çıktı biçimlendirebildi. C ++ cout da çıktı biçimlendirebilir ama bunu yapmak için farklı bir yol kullanır.
02
08
Çıktıyı Biçimlendirmek için Cout'u Kullanma
Nesne cout, iostream kütüphane. Bunun bir
#Dahil etmek
Bu kütüphane iostream den türetilmiştir ostream (çıktı için) ve istream giriş için.
Biçimlendirme metin çıktısı çıkış akımına manipülatörler eklenerek yapılır.
Manipülatör Nedir?
Çıkış (ve giriş) akışının özelliklerini değiştirebilen bir işlevdir. Önceki sayfada bunu gördük << çağıran nesneye başvuru döndüren aşırı yüklenmiş bir işlevdi; çıkış için cout veya giriş için cin. Tüm manipülatörler bunu yapar, böylece bunları çıktıya dahil edebilirsiniz << veya giriş >>. Girdiye bakacağız ve >> daha sonra bu derste.
say << endl;
endl çizgiyi sonlandıran (ve yeni bir tane başlatan) bir manipülatördür. Bu şekilde de çağrılabilen bir işlevdir.
endl (cout);
Uygulamada bunu yapmasanız da. Bunu böyle kullanıyorsun.
cout << "Bazı Metinler" << endl << endl; // İki boş satır.
Dosyalar Sadece Akışlı
Bu günlerde çok fazla gelişme ile yapılan akılda tutulması gereken bir şey GUI uygulamaları için neden metin I / O işlevlerine ihtiyacınız var? Bu sadece için değil konsol uygulamalar? Muhtemelen dosya G / Ç yapacaksınız ve orada da kullanabilirsiniz, ancak ekrana çıktı ne genellikle biçimlendirme gerekir. Akışlar, girdi ve çıktıları işlemenin çok esnek bir yoludur ve
- Metin G / Ç. Konsol uygulamalarında olduğu gibi.
- Teller. Biçimlendirme için kullanışlı.
- Dosya G / Ç.
Yine Manipülatörler
Her ne kadar ostream sınıf, bu bir Türetilmiş sınıf -dan ios sınıftan türetilmiş sınıf ios_base. Bu ata sınıfı halkı tanımlar fonksiyonlar bunlar manipülatörlerdir.
03
08
Cout Manipülatörleri Listesi
Manipülatörler giriş veya çıkış akışlarında tanımlanabilir. Bunlar, nesneye bir başvuru döndüren ve nesnelerin çiftleri arasına yerleştirilen nesnelerdir. <<. Manipülatörlerin çoğu, fakat endl, uçları ve floş dan geliyorum
İşte daha ayrıntılı bir liste.
itibaren
- endl - Hattı sonlandırır ve sifonu çağırır.
- biter - '\ 0' ekler ( BOŞ) akış.
- flush - Arabelleği hemen çıktı almaya zorlar.
itibaren . Çoğu ilan edildi
- boolalpha - Bool nesnelerini "true" veya "false" olarak ekleyin veya çıkarın.
- noboolalpha - Bool nesnelerini sayısal değerler olarak ekleyin veya çıkarın.
- fixed - Kayan nokta değerlerini sabit biçimde ekleyin.
- bilimsel - Kayan nokta değerlerini bilimsel biçimde girin.
- internal - Dahili yaslama.
- left - Sola yasla.
- sağ - Sağa yasla.
- dec - Tamsayı değerlerini ondalık biçimde girin veya çıkarın.
- hex - Tamsayı değerlerini onaltılık (temel 16) biçiminde girin veya çıkarın.
- oct - Sekizli (temel 8) biçimde değerler ekleyin veya çıkarın.
- noshowbase - Değeri tabanıyla önek olarak eklemeyin.
- showbase - Tabanı ile önek değeri.
- noshowpoint - Gerekmiyorsa ondalık basamak gösterme.
- showpoint - Kayan nokta değerleri eklerken daima ondalık noktayı göster.
- noshowpos - Sayı> = 0 ise artı işareti (+) eklemeyin.
- showpos - Sayı> = 0 ise artı işareti (+) ekleyin.
- noskipws - Çıkarma sırasında ilk beyaz boşluğu atlamayın.
- skipws - Ayıklandığında ilk beyaz boşluğu atla.
- nouppercase - Küçük harfleri büyük harf eşdeğerleriyle değiştirmeyin.
- büyük harf - Küçük harfleri büyük harf eşdeğerleriyle değiştirin.
- unitbuf - Bir insertten sonra tamponu yıkayın.
- nounitbuf - Her eklemeden sonra tamponu yıkamayın.
04
08
Cout Kullanan Örnekler
// ex2_2cpp. #include "stdafx.h" #Dahil etmekad alanı std kullanarak; int main (int argc, char * argv []) { cout. genişliği (10); cout << sağ << "Test" << endl; cout << sol << "Test 2" << endl; cout << dahili << "Test 3" << endl; cout << endl; cout. karar (2); cout << 45.678 << endl; cout << büyük harf << "David" << endl; cout. karar (8); cout << bilimsel << endl; cout << 450678762345.123 << endl; cout << sabit << endl; cout << 450678762345.123 << endl; cout << showbase << endl; cout << showpos << endl; cout << hex << endl; cout << 1234 << endl; cout << oct << endl; cout << 1234 << endl; cout << aralık << endl; cout << 1234 << endl; cout << noshowbase << endl; cout << noshowpos << endl; cout.unsetf (ios:: büyük harf); cout << hex << endl; cout << 1234 << endl; cout << oct << endl; cout << 1234 << endl; cout << aralık << endl; cout << 1234 << endl; dönüş 0; }
Bundan çıktı, netlik için bir veya iki ekstra satır boşluğu kaldırılmış olarak aşağıdadır.
Ölçek. Test 2. Test 3. 46. David. 4.50678762E + 011. 450678762345.12299000. 0X4D2. 02322. +1234. 4d2. 2322. 1234.
Not: Büyük harfe rağmen David, DAVID yerine David olarak basılmıştır. Bunun nedeni büyük harfin yalnızca üretilen çıktıyı etkilemesidir. basılan numaralar onaltılık. Dolayısıyla, büyük harf kullanımdayken 4d2 altıgen çıkışı 4D2 olur.
Ayrıca, bu manipülatörlerin çoğu aslında bir bayrağa biraz koyar ve bunu doğrudan ayarlamak mümkündür.
cout.setf ()
ve ile temizle
cout.unsetf ()
05
08
G / Ç Biçimlendirmesini Değiştirmek için Setf ve Unsetf Kullanma
İşlev setf iki tane var aşırı aşağıda gösterilmiştir. Süre unsetf sadece belirtilen bitleri temizler.
setf (bayrak değerleri); setf (bayrak değerleri, maske değerleri); unsetf (bayrak değerleri);
Değişken bayrakları ORing | ile istediğiniz tüm bitleri bir arada. Yani istersen bilimsel, büyük harf ve boolalifa sonra bunu kullan. Sadece bitler parametre ayarlanır. Diğer bitler değişmeden kalır.
cout.setf (ios_base:: bilimsel | ios_base:: büyük harf | ios_base:: boolalpha); cout << hex << endl; cout << 1234 << endl; cout << aralık << endl; cout << 123400003744.98765 << endl; bool değeri = true; cout << değer << endl; cout.unsetf (ios_base:: boolalpha); cout << değer << endl;
üretir
4D2. 1.234000E + 011. doğru. 1.
Maskeleme Uçları
İki parametre setf sürümü bir maske kullanır. Bit hem birinci hem de ikinci parametrelerde ayarlanırsa, ayarlanır. Eğer bit sadece ikinci parametrede ise silinir. Değerler ayarlama alanı ve floatfield (aşağıda listelenmiştir) bileşik bayraklardır, yani birkaç bayraktır OR operatörüyle birlikte. İçin basefield değerlerle 0x0e00 aynıdır aralık | oct | büyü. Yani
setf (ios_base:: hex, ios_basefield);
üç bayrağı da temizler ve sonra büyü. benzer şekilde adjustfield dır-dir kaldı | doğru | iç ve floatfield dır-dir bilimsel | sabit.
Bit Listesi
Bu numaralandırma listesi Microsoft Visual C ++ 6.0'dan alınır. Kullanılan gerçek değerler isteğe bağlıdır; başka bir derleyici farklı değerler kullanabilir.
skipws = 0x0001. unitbuf = 0x0002. büyük harf = 0x0004. showbase = 0x0008. gösteri noktası = 0x0010. showpos = 0x0020. sol = 0x0040. sağ = 0x0080. dahili = 0x0100. dec = 0x0200. oct = 0x0400. hex = 0x0800. bilimsel = 0x1000. sabit = 0x2000. boolalal = 0x4000. ayar alanı = 0x01c0. basefield = 0x0e00, floatfield = 0x3000. _Fmtmask = 0x7fff, _Fmtzero = 0.
06
08
Clog ve Cerr Hakkında
Sevmek cout, takunya ve CERR ostream'de tanımlanan önceden tanımlanmış nesnelerdir. İostream sınıfı her ikisinden de miras alır ostream ve istream bu yüzden cout örnekler kullanabilir iostream.
Arabellek ve Tamponsuz
- Arabellek - Tüm çıkış geçici olarak bir tampon ve sonra tek seferde ekrana attı. Hem cout hem de clog tamponludur.
- Tamponsuz - Tüm çıkışlar hemen çıkış cihazına gider. Tamponlanmamış bir nesneye örnek olarak serr verilebilir.
Aşağıdaki örnek serr'in cout ile aynı şekilde kullanıldığını gösterir.
#Dahil etmek ad alanı std kullanarak; int _tmain (int argc, _TCHAR * argv []) {cerr.width (15); cerr.right; cerr << "Hata" << endl; dönüş 0; }
Arabelleğe alma ile ilgili temel sorun, program çöktükten sonra arabellek içeriği kaybolur ve neden çöktüğünü görmek daha zordur. Tamponsuz çıktı hemen bu nedenle kod yoluyla böyle birkaç satır serpmek faydalı olabilir.
cerr << "Tehlikeli fonksiyona girme zappit" << endl;
Günlüğe Kaydetme Sorunu
Program olaylarının bir günlüğünü oluşturmak, zor hataları tespit etmek için yararlı bir yol olabilir - sadece arada bir meydana gelen tür. Bu olay bir çökme olsa da, sorun vardır - olayları görebilmek için her aramadan sonra günlüğü diske temizler misiniz? kazaya kadar veya bir tamponda saklayın ve periyodik olarak tamponu yıkayın ve kaza olduğunda çok fazla kaybetmeyeceğinizi umuyoruz oluşur?
07
08
Giriş için Cin Kullanımı: Biçimli Giriş
İki tür girdi vardır.
- Biçimlendirilmiş. Girişi sayı veya belirli tipte okuma.
- Biçimlenmemiş. Bayt okuma veya Teller. Bu, giriş akışı üzerinde çok daha fazla kontrol sağlar.
İşte biçimlendirilmiş girdinin basit bir örneği.
// excin_1.cpp: Konsol uygulaması için giriş noktasını tanımlar. #include "stdafx.h" // Yalnızca Microsoft. #Dahil etmek ad alanı std kullanarak; int main (int argc, char * argv []) { int a = 0; şamandıra b = 0.0; int c = 0; cout << "Lütfen boşluklarla ayrılmış bir int, float ve int girin" <> a >> b >> c; cout << "" << a << "" << b << "" << c << endl; dönüş 0; }
Bu, cin'i üç sayıyı okumak için kullanır (int, şamandıra, int) boşluklarla ayrılmış. Numarayı yazdıktan sonra enter tuşuna basmalısınız.
3 7.2 3 "3 7.2 3 girdiniz" mesajı verecektir.
Biçimlendirilmiş Girdinin Sınırlamaları Var!
3.76 5 8 girerseniz, "3 0.76 5 girdiniz" yazarsanız, bu satırdaki diğer tüm değerler kaybolur. Bu doğru davranıyor. int'nin bir parçası değildir ve bu yüzden şamandıranın başlangıcını işaretler.
Hata Yakalama
Giriş başarıyla dönüştürülmediyse cin nesnesi bir hata biti ayarlar. Bu parça ios ve okunarak okunabilir başarısız() her ikisinde de işlev cin ve cout bunun gibi.
if (cin.fail ()) // bir şeyler yapın.
Şaşırtmayan bir şekilde, cout.fail () en azından ekran çıktısında nadiren ayarlanır. Dosya G / Ç ile ilgili daha sonraki bir derste, cout.fail () gerçek olabilir. Ayrıca bir iyi() için işlev cin, cout vb.