Akışlar(Streams)

[vc_row][vc_column][vc_column_text]

Modern C++ ile Akışlar; standart kütüphane kapları ve algoritmalarının kullanımını kolaylaştırmak için verilere tembel değerlendirme ve işlevsel stil dönüşümleri sağlayan bir C++ 14 kütüphanesidir <iostream>.

C++ I\O işlemleri, bayt akışlarına dayanır ve aygıttan bağımsızdır. Aynı işlem seti, farklı IO cihaz türlerine uygulanabilir.

 

C/C++ IO, programlardan içeri ve dışarı akan bayt dizisi olan akışlara dayanır(tıpkı bir su borusunun içinden akan petrol gibi). Giriş işlemlerinde, veri baytları bir girdi kaynağından(klavye, dosya, ağ veya başka bir program gibi) programa akar.Çıkış işlemlerinde, veri baytları programdan bir çıkış gider (konsol, dosya, ağ veya başka bir program gibi) akar. Akışlar, programları ve gerçek IO cihazları arasında, programcıların cihazları bağımsız IO işlemlerini arşivleyebilmesi için gerçek cihazları kullanmasını önleyecek şekilde aracılar.

C ++, << ve >> operatörlerini kullanarak konsola veri girişi ve çıkışı yapmanızı sağlayan standart bir iostream kitaplığı tanımlar.

cin ve cout std ad uzayında ön tanımlıdır. Ayrıca, önceden tanımlanmış, cerr adı verilen ve hata iletileri çıktısı için kullanışlı bir nesne de vardır. Bu üç nesne <iostream> header dosyasında tanımlanır.

  • cin istream sınıfının bir üyesidir ve bilgisayardan girdi almanıza izin verir.
  • cout ostream sınfının bir üyesidir ve ekranan bir çıktı vermenize izin verir.
  • cerr – standart hataya bağlı bir ostream_withassign sınıfı, arabelleksiz çıkış sağlar.

Örneğin;

#include <iostream>
#include <cstdlib>

int main()
{
   std::cout << "Yasinizi griniz:  " << std::endl;
   int yas;
   std::cin >> yas;
   if (yas <= 0)
   {
    std::cerr << "Geçersiz deger girdiniz" << std::endl;        exit(1);
   }
    std::cout << yas << " Yasindasiniz" << std::endl;
    return 0;
}

 

<cstdlib> kütüphanesi C dilindeki stdlib.h kütüphanesine karşılık gelmektedir.İçerisinde dinamik bellek yönetimi, tamsayı aritmetiği, arama, sıralama da dahil olmak üzere birçok genel amaçla kullanılabilir.

Stringler için giriş ve çıkış

std::string sınıfı string header dosyasının içerisinde tanımlıdır. Program başlatılmadan önce #include <string> olarak eklenmelidir.

Örneğin;

#include <iostream>
#include <string>
    …
    std::string s;
    cin >> s;
    std::cout << "Bu bir string ifadedir" << s << std::endl;

 

Not: cin için kullanılan >> operatörü girilen ifadede ilk boşluk karakterine kadar okumaktadır.Eğer çoklu metin satırları girmek istiyorsanız;

std::getline()

 

Fonksiyonunu kullanabilirsiniz.

Örneğin;

    std::string isim;
    std::cout << "Isminizi giriniz ";
    std::getline(std::cin, isim);

    std::string adres;
    std::cout << "Adresinizi giriniz: ";
    std::getline(std::cin, adres);

    std::cout
        << isim << std::endl
        << adres << std::endl;

 

Genişletilmiş akış kullanımları

istream ve ostream sınıfları temel veri tipleri için giriş- çıkış sağlar. Örneğin; bir nokta sınıfı tanımlarsanız nokta nesnelerini bir akış kullanarak giriş ve çıkış olarak kullanamazsınız:

class Nokta
{
...

};
Nokta p1;

Std :: cin >> p1; // Derleyici hatası, >> işlevi bu işlem için kullanılamaz

Std :: cout << p1; // Derleyici hatası, << işlevi bu işlem için kullanılamaz

Bu işlemi yapabilmeniz için operatör overloading işlemi tanımlanmıştır.

Örneğin;

std::istream & operator >> (std::istream &is, point & p)
    {
        is >> p.x >> p.y;
        return is;
    }

 

Yukarıdaki kodda >> operatörü overload edilerek parametre olarak gelen nokta nesnesini giriş olarak almayı sağlamaktadır.

Aynı şekilde << operatörü de overload edilerek ekrana nokta nesnesi direkt olarak yazdırılabilir:

std::ostream & operator<<(std::ostream & os, const poin &p)
{
        os << "[" << p.x << "," << p.y << "]";
        return os;
}

 

Kullanımı:

std::cout<< "Noktalar: " << std::endl
std::cout<< p1 << std::endl
std::cout<< p2 << std::endl;

 

>> operatörü gördüğü ilk beyaz boşlukta (enter,tab,space) akışı keser. Eğer boşluklarla birlikte bir satır almak istiyorsanız string kütüphanesi içerisinde bulunan getline fonksiyonunu kullanmalısınız.

std::string name;
std::cout << "Full name: ";
std::getline(std::cin, name);

std::string address;
std::cout << "Full address: ";
std::getline(std::cin, address);

std::cout << name << std::endl
          << address << std::endl;

 

Sınıflara giriş çıkış özelliği ekleme (<< ve >> operatörlerini aşırı yükleme)

Giriş ve çıkış operatörlerini aşırı yükleme yoluyla kendi yazdığımız sınıflara uygun hale getirebiliriz.

Çıkış opertörünü(<<) aşırı yüklerken dönüş türü std::ostream& olmalıdır. Çünkü tek satırda tekrar tekrar çıkış vermek için dönüş değeri tekrar işleme girebilir. Argüman olarak iki değer alır. BU değerlerden biri cout bir diğeri de sınıftır. Şöyle düşünülebilir. cout << sınıf;

Giriş operatörünü(>>) aşırı yüklerken dönüş türü std::istream& olmalıdır. Bu sayede arka arkaya giriş operatörü kullanılabilir. Bunun dışında argüman olarak yine cin ve sınıfı alması gereklidir. cin >> sınıf;

Örnek:

template<typename T>
struct Point
{
	T x, y;
	Point() : x{}, y{} {}
	Point(T t_x, T t_y) : x(t_x), y(t_y) {}
	friend std::ostream& operator<< (std::ostream& out, const Point& point)
	{
		out << "x=" << point.x << " y=" << point.y << std::endl;
		return out;
	}
	friend std::istream& operator>> (std::istream& in, Point& point)
	{
		std::cout << "Once x sonra y koordinatini giriniz..." << std::endl;
		in >> point.x;
		in >> point.y;
		std::cout << std::endl;
		return in;
	}
};

int main()
{
    Point<int> point{ 512 , 512 };
    std::cout << point ;
    std::cin >> point;
}

 

Program çıktısı:

x=512 y=512

Once x sonra y koordinatini giriniz...

400 600

 

Yazdığımız sınıflar için bu operatörleri aşırı yükledikten sonra kullanılabilir hale gelirler.

Manipülatörler

Çıkış akışından ekrana gelen veriyi düzenlenebilir. Yazdırılacak verinin genişliğini ayarlanabilir. Küsurlü sayıların noktadan sonra kaç rakam göstereceği belirlenebilir.

Akışları manipülatörler ile kontrol edilebilir. Manipülatörler istenilen düzeltme işlemi yapılabilmesi için önceden tanımlanmış nesnelerdir.

En basit örnek std::endl’dir. Bu manipülatör ekrana \n karakteri yazdırır ve streamın içini boşaltır.

Genel olarak manipülatörler <iomanip> kütüphanesinde dururlar. Parametre alan manipülatörleri kullanmak için (örneğin setw) <iomanip> kütüphanesini eklenmeli.

Manipülatörlerden ayrı olarak bayraklar da çıkış düzenlemek için kullanılabilir.

[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column width=”1/2″][vc_btn title=”Önceki Ders” color=”green” align=”left” i_icon_fontawesome=”fa fa-chevron-left” add_icon=”true” link=”url:https%3A%2F%2Fyapbenzet.org.tr%2Fcpp-sanal-fonksiyonlar%2F|||”][/vc_column][vc_column width=”1/2″][vc_btn title=”Sonraki Ders” color=”green” align=”right” i_align=”right” i_icon_fontawesome=”fa fa-chevron-right” add_icon=”true” link=”url:https%3A%2F%2Fyapbenzet.org.tr%2Fcpp-dosya-isleme%2F|||”][/vc_column][/vc_row]