"Enter"a basıp içeriğe geçin

Stream (Iostream)

Bu yazıda iostream sınıfının ne olduğunu inceleyeceğiz. Ama öncelikle stream neydi onu hatırlayalım.

Stream nedir

Stream’ler harddiskteki dosyalar ile bellek (program) arasında bayt dizisi şeklinde veri taşıyan, girdi-çıktı işlemleri yapan bir yapıdır. Biz bir exe dosyasını çalıştırdığımızda, program ram belleğe yüklenir. Eğer programımız, exe dosyasında bulunmayan bir veriye erişmek istiyorsa (harddiskteki bir dosya olabilir, klavye mouse, sensörler gibi dış aygıtlar olabilir, ama biz harddiskteki dosyalardan bahsedeceğiz) o dosya ile bellek arasında bir stream oluşturması gerekir.

Buffer nedir 

Bellekten veri okumak ve belleğe birşeyler yazmak maliyetli işlemlerdir. Stream’e her veri geldiğinde belleğe işlenmesi de doğal olarak maliyeti arttırır. Bunun yerine, gelen veriler buffer denilen bir alanda toplanır. Ve bir miktar biriktikten sonra birikenlerin tamamı belleğe yazılır. Böylece belleğe yazma sayısı azalır ve programımız hızlanmış olur. Buffer dolduğu zaman boşalabileceği gibi, program istediğinde de boşalabilir.

iostream kütüphanesi

c++’deki temel input output stream’idir. Siyah ekranı temsil eder.

Siyah ekran olarak gördüğümüz şey de aslında bir dosyadır. Biz ekrana bir şey yazdığımız zaman bu dosyalara işlenir.

iostream kütüphanesi cin,cout,cerr ve clog nesnelerine sahiptir.

cout ile standart stream’e yolladıklarımız, out dosyasına yazılır ve siyah ekranda gözükür. Yani cout, bellek ile out dosyası arasında dosya aktarımı yapan bir streamdir.  Aynı şekilde cin ile almak istediklerimiz de in dosyasından yani siyah ekrandan alınır. İostream, in ve out dosyaları ile programımız arasında aktarma görevi gören bir stream yapısıdır. Kısacası iostream = siyah ekran diyebiliriz.

istream input, ostream output işlemleri için oluşturulan sınıflardır. (iostream istream ve ostream’den, onlar da ios’dan gelmiştir)

stream kütüphanelerinde aşırı yüklenmiş 2 operatör bulunur. Bunlar << ve >> işaretleridir.

<< ile bir stream’e veri yollayabilir, >> ile de veri alabiliriz. Bu operatörler standart tipler için aşırı yüklenmiştir. Kendi tiplerimiz için de aşırı yükleyebiliriz.

cout << flush; ile buffer’u boşaltabiliriz.

ostream

çıkış stream’idir.
cout<<veri; ile veri değişkenini stream’e yollarız. Burada cout dediğimiz için siyah ekrana yollamış oluruz. Cout ile tüm veri tiplerini yollayabiliriz ve  << operatörü aşırı yüklendiği için hangi tipi yolladığımızı anlar.

cerr de cout gibidir. Hata mesajları için kullanılır.

put üye fonksiyonu :

cout.put(‘A’); ile belirtilen stream’e tek bir karakter yollayabiliriz. Mesela burda cout dediğimiz için siyah ekrana A karakteri yazar. Kendi stream’imizi yazsaydık ona yollayacaktı. cout.put(65); diyerek ascii karşılığı da yollanabilir.

 

 

istream:

giriş stream’idir

cin>>veri; ile stream’den bişey alıp, veri değişkenine atarız. veri değişkeninin tipini cin fonksiyonu bilir. Siyah ekranda boşluk karakterlerine kadarki kısmı alır. Eğer boşlukları da almak istiyorsak global bir fonksiyon olan getline kullanmalıyız.
getline (cin,veri); // cin>>veri ile aynı işi görür. Ama boşlukları da alır.

>> operatörü aslında bir fonksiyondur. EOF (end of file) ile karşılaşırsa 0 döndürür. Bunun dışında sağındaki değişkenin referansını döndürür. Ve bu referansa göre okuma-yazma işlemi yapılır.
Mesela while(cin >> veri) diyerek EOF ile karşılaşana kadar veri okumasını sağlayabiliriz

EOF karakteri girene kadar sürekli sayı alıp bunların en büyüğünü bulan bir program yazdık.

 

 

get üye fonksiyonu

a=cin.get(); stream’den (burada cin olduğu için siyah ekran) tek bir karakter alır (boşluk ve enter dahil) Eğer bufferda bir şey varsa onu alır. Yoksa siyah ekrandan girdi ister.

EOF girilene kadar sürekli terminalden karakter alır, alınan karakterler buffer’a yollanır. cout.put bufferdan bir karakter alır ve cout da yine ekrana basar.

Bu çıktıda fark etmemiz gereken 2 şey var. Öncelikle harf girildikten sonra harfi yazıp 2 boşluk bırakıyor. Çünkü  enter da karakter yani onu da yazar. İkinci olarak, ifs girdiğimizde 4 karakter (\n dahil) de buffer’a alınıyor. Ancak her while döngüsünde cout.put fonksiyonu 1 karakter alır. Diğerleri bufferda kaldığı için, while döngüsü döndüğünde buffer içindeki sıradaki harfi alıp yazdırır. Yani buffer’da bir şeyler olduğu sürece bizim bir şey girmemiz gerekmez. Buffer dolu olduğu sürece döngüde buffer’daki sıradaki karakteri yazdırır. Harfi yazdıktan sonra alt satıra geçmesini sağlayan da while döngüsünün sonundaki  cout<<endl dir. Eğer buffer içinde harf kalmazsa, siyah ekran bizden bir harf girmemizi ister
BURASI ANLAŞILMASI ZOR AMA AŞIRI ÖNEMLİ BİR AYRINTI ANLAMADAN GEÇME

harf= dememize aslında gerek yok. cin.get( harf ): dersek de aynı işlevi görür

Bu fonksiyonu birden çok karakter alacak şekilde de ayarlayabiliriz: Az önce gördüğümüz gibi aslında girdiğimiz her şeyi buffer’a alıyordu ancak stream’e bizim belirttiğimiz kadarını aktarıyordu. cout.put fonksiyonu normalde tek tek alır. Bunun yerine kendimiz de bir sayı verebiliriz. Ancak hepsini tek seferde alması için bir diziye aktarmalıyız. Çünkü char sadece 1 karakter alabilir.

Bunun için öncelikle kendi buffer’ımız gibi  davranacak bir dizi tanımlamalıyız. Parametre kısmına bu diziyi ve aynı anda  kaç karakter alabileceğini yazarız.

Karakter sınırını aşana yada enter girilene kadarki kısmı alır ve diziye yazar. Ve sonuna NULL karakter koyar.

Asıl buffera 21 karakter geldi. Bunlar tek tek buffer1 dizisine atıldı. Dizinin 22. adresine null karakter kondu. Cout, sringin null karakterine kadarki kısmı yazdırdığı için, dizinin ilk 21 elemanı yani aslında girdiğimiz metin yazıldı.

 

ignore  üye fonksiyonu

stringden gelen belli sayıda karakteri atlar.

Bu fonksiyonu belli bir karakter girilene kadar atlayacak şekilde ayarlayabiliriz:

 

 

putback üye fonksiyonu

bir karakteri  buffer’a geri yollamaya yarar

 

 

Formatsız Çıktı

Buraya kadar öğrendiklerimiz genelde formatlı girdi-çıktıydı. Yani bitmesi için bir sınırlandırıcı lazımdı.(\n, EOF vb.)
Formatsız çıktı ise belirttiğimiz sayı kadar karakteri alır. Read ve write fonksiyonlarından oluşur.

width üye fonksiyonu: cin ve cout için okunacak-yazılacak karakter miktarını ayarlar

 

 

 

    Bir cevap yazın

    E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir