Programlarımızda, özellikle küçük olanlarda ya da bazı değerleri hızlıca görüntülemek için, en sık kullandığımız yöntemlerden birisi de standart çıktıya bir şeyler basmaktır.
Bunun için de kullanılan en yaygın yöntem, C++ için, std::cout‘tır muhtemelen. Peki bu kardeşimizin kabiliyetlerine ne kadar vakıfız? İşte bu yazımda bu kardeşimize ilişkin yetenekler ile sizleri buluşturacağım.
Öncelikli olarak standart çıktıya bastıklarınızı kontrol etmenize yarayan yapılara “I/O manipulator” denilmekte, biz bunlara Girdi/Çıktı Manipülatörleri diyeceğiz. Bunları kullanabilmek için “#include <iomanip>” başlık dosyasını kodunuzun içerisine eklememiz gerekiyor. Bu manipülatör’lerin çoğu aslında bir fonksiyon ve özel olarak <<, >> ile birlikte kullanmak üzere tasarlanmıştır, aynı zamanda fonksiyon gibi de çağırabilirsiniz (dikkatli okuyucularım, çoğu dediğimi fark etmişlerdir, çünkü setw, setprecision, setbase, setfill, resetiosflags, setiosflags bu kullanımın dışında). Hemen bir örneğe bakalım:
1 2 3 4 5 6 7 8 |
bool value = false; std::boolalpha(std::cout); std::cout << value << std::endl; ile bool value = false; std::cout << std::boolalpha << value << std::endl; |
aynı çıktıyı verir.
Şimdi gelelim önemli manipülatörlere. Diğer yazılarımda olduğu gibi bana göre en önemli olanları, kalem kalem, sıralamaya çalışacağım. Tam liste için kaynaklar kısmındaki sayfalara başvurabilirsiniz.
- boolalpha, noboolalpha:
- Boolean değerlerin metinsel/nümerik gösterimi için kullanılır. Varsayılan nümerik (noboolalpha) gösterim aktiftir, true değerler 1 ve false değerler 0 olarak bastırılır. boolalpha ile birlikte bu değerler sırası ile “true ve “false” olarak bastırılır.
- showbase, noshowbase:
- showbase çağrıldığı durumda 8 düzene göre olan sayılar başların O, 16 lık düzene göre olanlar 0x olarak gösterilir.
1234567891011#include <iostream>#include <iomanip>using namespace std;int main(){int n1 {10}; // 10 luk düzende 10int n2 {010}; // 8 lik düzene göre 8int n3 {0x10}; // 16 düzende 16cout << showbase << setbase(16) << "n1 = " << n1 << ", n2 = " << n2 << ", n3 = "<< n3 << "\n";return 0;}
- showbase çağrıldığı durumda 8 düzene göre olan sayılar başların O, 16 lık düzene göre olanlar 0x olarak gösterilir.
- showpoint, noshowpoint:
- showpoint kullanıldığı zaman, ondalık kısımlar her zaman gösterilir. Varsayılan olarak tam sayıya yuvarlanır.
12auto n1 {10.0F};cout << "Once: " << n1 << showpoint << " Sonra:" << n1 << "\n";
- showpoint kullanıldığı zaman, ondalık kısımlar her zaman gösterilir. Varsayılan olarak tam sayıya yuvarlanır.
- showpos, noshowpos:
- showpos ile birlikte, pozitif sayıların önünde ek olarak ‘+‘ gösterilir. Varsayılan olarak gösterilmez.
- hexfloat, fixed scientific, defaultfloat:
- İsimlerinden de anlayacağınız üzere bu fonksiyonlar da, ondalık sayıların nasıl gösterileceğini belirliyor. Ayrıca, girdi olarak verilen değerleri de buna göre ayıklar. Bunları uzun uzadıya anlatmaktansa, sanırım örnek vermek daha iyi olacak.
-
12345678910111213#include <iostream>#include <sstream>using namespace std;int main(){cout << "0.01 - fixed: " << std::fixed << 0.01 << '\n'<< "0.01 - scientific: " << std::scientific << 0.01 << '\n'<< "0.01 - hexfloat: " << std::hexfloat << 0.01 << '\n'<< "0.01 - default: " << std::defaultfloat << 0.01 << '\n';double f;istringstream("0x1P-1022") >> std::hexfloat >> f;cout << "0x1P-1022 hex olarak ayikladigimizda elde ettigimiz deger:" << f << '\n';}
- setprecision(n):
- Ondalık bir sayı gösterildiği durumda, noktadan sonra gösterilecek rakam adetini belirler. Varsayılan adet 6’dır.
12345678910111213141516#include <iostream>#include <iomanip>#include <cmath>#include <limits>using namespace std;int main(){const long double pi = std::acos(-1.L);cout << "default precision (6): " << pi << '\n'<< "setprecision(10): " << setprecision(10) << pi << '\n'<< "max precision: "<< setprecision(numeric_limits<long double>::digits10 + 1)<< pi << '\n';}
- Ondalık bir sayı gösterildiği durumda, noktadan sonra gösterilecek rakam adetini belirler. Varsayılan adet 6’dır.
- setbase(n):
- Girdi ve çıktı için kullanılan sayı sistemini belirler. 8, 10, 16 ve 0 alabilir. 0 çıktı için ondalık gösterim anlamına gelse de girdi için girilen sayıdan sayı sistemini belirle anlamına gelir.dec, hex, octTam sayılar için kullanılan sayı sistemini belirler. setbase(10), setbase(16) ve setbase(8) ile de aynı sonucu alabilirsiniz.
- ws:
- İlk boşluk olmayan karakteri görene kadar olan boşluk karakterlerini atar.
123456789101112#include <iostream>#include <istream>#include <sstream>#include <string>int main(){std::istringstream s(" this is a test");std::string line;std::getline(s >> std::ws, line);std::cout << "ws + getline returns: \"" << line << "\"\n";}
- İlk boşluk olmayan karakteri görene kadar olan boşluk karakterlerini atar.
- ends:
- Çıktıya ‘\0’ ekler.
- flush:
- Çıktıya yığılan karakterleri bastırmak üzere gönderir.
- endl:
- Çıktıya ‘\n’ ekler ve bastırmak üzere gönderir.
- setiosflags(n)/resetiosflags(n):
- Verilen std::ios sabitlerini atar veya sıfırlar.
12345678910#include <iostream>#include <iomanip>int main(){std::cout << std::resetiosflags(std::ios_base::dec)<< std::setiosflags( std::ios_base::hex| std::ios_base::uppercase| std::ios_base::showbase) << 42 << '\n';}
- Verilen std::ios sabitlerini atar veya sıfırlar.
- setw(n):
- Bir sonraki çıktı için tanımlanan genişliği belirler. Burada eğer bu alanda boşluk kalır ise setfill ile belirlenmiş olan karakter ile doldurulur.
- setfill(c):
- Boşlukları doldurmak için kullanılacak olan karakteri belirler. Buradaki boşluklardan kasıt, setw ile tanımlanan genişlikten daha az uzunlukta bir karakter gösterilmesinde durumunda kalan boşluklardır. Varsayılan olarak boşluk karakteri kullanılır.
- internal, left, right:
- Boşluk için belirlenmiş karakterlerin nereye yerleştirileceğini belirler. left ve right seçeneği her çıktı için kullanılabilecekken, internal sadece tam, ondalık sayı ve parasal gösterimler için kullanılır.
-
123456789101112131415161718#include <iostream>#include <iomanip>#include <locale>int main(){std::cout << "Left fill:\n" << std::left << std::setfill('*')<< std::setw(12) << -1.23 << '\n'<< std::setw(12) << std::hex << std::showbase << 42 << '\n';std::cout << "Internal fill:\n" << std::internal<< std::setw(12) << -1.23 << '\n'<< std::setw(12) << 42 << '\n';std::cout << "Right fill:\n" << std::right<< std::setw(12) << -1.23 << '\n'<< std::setw(12) << 42 << '\n';}
Evet arkadaşlar, artık uygulamalarınızda konsolu, standart çıktıyı, istediğiniz gibi kullanabilirsiniz 🙂
Bir sonraki yazımda buluşmak dileğiyle.